Graphics.Clear sur un contrôle Windows Form efface également le contrôle lui-même – comment éviter cela ?
Question
J'essaie de dessiner un rectangle de sélection personnalisé sur une Picturebox, en utilisant la méthode ci-dessous :
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);
}
}
Chaque fois que j'appelle :
g.Clear(Color.Transparent);
toute la boîte à images devient noire.Cependant, le rectangle est dessiné dessus.Si je n'appelle pas cette méthode, les rectangles s'empilent sur eux-mêmes, bien sûr.Je souhaite supprimer l'ancien rectangle et en créer un nouveau comme celui-ci.
Quelqu'un peut-il décrire ce qui ne va pas ?
La solution
Ne peignez pas votre contrôle à l'intérieur d'une autre méthode que OnPaintBackground
ou OnPaint
.
En fait, vous en aurez peut-être besoin pour des raisons de performances (vous n'actualiserez pas le contrôle complet, vous changerez simplement quelque chose à la volée), mais cela rendra votre code beaucoup plus délicat et vous devrez toujours faire le même travail à l'intérieur du Paint
événement également (car il peut être appelé pour de nombreuses autres raisons et le résultat doit donc être le même).
À l'intérieur de Paint
vous n'avez même pas besoin d'utiliser CreateGraphics
, le contexte graphique est à l'intérieur du PaintEventArgs
objet alors changez votre code en :
void DoPainting(object sender, PaintEventArgs e)
{
// Do your calculations
e.Graphics.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
}
Comme l'a souligné @AndersForsgren pour utiliser le CreateGraphics
La méthode n'est pas courante et vous n'avez généralement pas besoin de l'appeler (à l'exception indiquée avant et lorsque, par exemple, vous devez effectuer des calculs basés sur les graphiques comme pour AutoSize).