Graphics.Clear su un controllo del modulo Windows cancella anche il controllo stesso - Come impedire questo?

StackOverflow https://stackoverflow.com//questions/10703678

Domanda

Provo a disegnare un rettangolo di selezione personalizzato su un Picturebox, utilizzando il metodo sottostante:

    void _drag_UpdateView(bool clearOnly, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("UpdateView");
        using (Graphics g = this.i_rendered.CreateGraphics())
        {
            g.Clear(Color.Transparent);
            if (clearOnly)
                return;
            int px = (_drag_start.X > e.Location.X)?e.Location.X:_drag_start.X;
            int py = (_drag_start.Y > e.Location.Y)?e.Location.Y:_drag_start.Y;
            if (px < 0)
                px = 0;
            if (py < 0)
                py = 0;
            int wx = Math.Abs(e.Location.X-_drag_start.X);
            int wy = Math.Abs(e.Location.Y-_drag_start.Y);
            g.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
        }
    }
.

Ogni volta che chiamo:

g.Clear(Color.Transparent);
.

L'intero Picturebox diventa nero.Tuttavia, il rettangolo viene disegnato sopra. Se non invito quel metodo, i rettangoli si impilano su se stesso, ovviamente.Voglio rimuovere il vecchio rettangolo e crearne uno nuovo come questo.

Qualcuno può descrivere cosa c'è che non va?

È stato utile?

Soluzione

Non dipingere il controllo all'interno di qualsiasi altro metodo rispetto a OnPaintBackground o OnPaint.

In realtà potresti averne bisogno per motivi di performance (il tuo non si aggiornerà il pieno controllo, basta cambiare qualcosa su-the-fly) ma renderà il tuo codice molto più complicato e avrai sempre bisogno di fare lo stessoLavoro all'interno dell'evento Paint (perché può essere chiamato per molti altri motivi per cui l'output dovrebbe essere lo stesso).

All'interno del Paint non è nemmeno necessario utilizzare CreateGraphics, il contesto grafico è all'interno dell'oggetto PaintEventArgs, quindi modifica il codice su:

void DoPainting(object sender, PaintEventArgs e)
{
    // Do your calculations
    e.Graphics.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
}
.

Come indicato da @Andersforsgren per utilizzare il metodo CreateGraphics non è comune e di solito non è necessario chiamarlo (con l'eccezione puntata prima e quando, ad esempio, è necessario eseguire alcuni calcoli in base alla grafica come per AutoSize).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top