Graphics.Clear auf einem Windows Form-Steuerelement löscht auch das Steuerelement selbst – wie kann man das verhindern?

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

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?

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top