Graphics.Clear su un controllo del modulo Windows cancella anche il controllo stesso - Come impedire questo?
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?
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).