Graphics.Clear auf einem Windows Form-Steuerelement löscht auch das Steuerelement selbst – wie kann man das verhindern?
Frage
Ich versuche, mit der folgenden Methode ein benutzerdefiniertes Auswahlrechteck auf einer Picturebox zu zeichnen:
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);
}
}
Wann immer ich anrufe:
g.Clear(Color.Transparent);
Die gesamte Bildbox wird schwarz.Allerdings wird das Rechteck darüber gezogen.Wenn ich diese Methode nicht aufrufe, stapeln sich die Rechtecke natürlich.Ich möchte das alte Rechteck entfernen und ein neues wie dieses erstellen.
Kann jemand beschreiben, was falsch ist?
Lösung
Malen Sie Ihr Steuerelement nicht anders als OnPaintBackground
oder OnPaint
.
Tatsächlich benötigen Sie es möglicherweise aus Leistungsgründen (Sie aktualisieren nicht die vollständige Kontrolle, sondern ändern einfach etwas im laufenden Betrieb), aber es macht Ihren Code viel schwieriger und Sie müssen immer die gleiche Arbeit innerhalb des Codes erledigen Paint
Ereignis auch (da es aus vielen anderen Gründen aufgerufen werden kann und daher die Ausgabe dieselbe sein sollte).
Im Inneren Paint
Sie müssen es nicht einmal verwenden CreateGraphics
, der Grafikkontext befindet sich innerhalb der PaintEventArgs
Objekt, also ändern Sie Ihren Code in:
void DoPainting(object sender, PaintEventArgs e)
{
// Do your calculations
e.Graphics.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
}
Wie von @AndersForsgren darauf hingewiesen, dass die Verwendung von CreateGraphics
Die Methode ist nicht üblich und Sie müssen sie normalerweise nicht aufrufen (mit der Ausnahme, auf die zuvor hingewiesen wurde und wenn Sie beispielsweise einige Berechnungen basierend auf den Grafiken durchführen müssen, wie bei AutoSize).