it-swarm.com.de

Wie rufe ich Paint event auf?

Mein Programm zeichnet Text in seinem Panel, aber wenn ich den Text entfernen möchte, muss ich ihn neu streichen.

Wie rufe ich das Paint-Event von Hand auf?

43
Ivan Prodanov

Die Invalidate () - Methode führt zu einer Neulackierung.

MSDN Link

41
Matthew Vines

In einer Methode Ihres Formulars oder Steuerelements haben Sie drei Möglichkeiten:

this.Invalidate();  // request a delayed Repaint by the normal MessageLoop system    
this.Update();      // forces Repaint of invalidated area 
this.Refresh();     // Combines Invalidate() and Update()

Normalerweise rufen Sie einfach Invalidate() auf und lassen das System dies mit anderen Bildschirmaktualisierungen kombinieren. Wenn Sie es eilig haben, sollten Sie Refresh() anrufen. Es besteht jedoch die Gefahr, dass es aufgrund anderer Steuerelemente (vor allem der übergeordneten Komponente) mehrmals nacheinander lackiert wird. 

Normalerweise behandelt Windows (Win32 und WinForms.Net) dies, indem Sie darauf warten, dass MessageQueue leer ausgeführt wird, und dann alle ungültigen Bildschirmbereiche verarbeiten. Das ist effizient, denn wenn sich etwas ändert, ändert sich das normalerweise in andere Dinge (Steuerelemente). 

Das häufigste Szenario für Update () ist das Ändern einer Eigenschaft (beispielsweise label1.Text, wodurch das Label ungültig wird) in einer for-Schleife, und diese Schleife blockiert die Nachrichtenschleife vorübergehend. Wann immer Sie es verwenden, sollten Sie sich fragen, ob Sie stattdessen einen Thread verwenden sollten. Aber die Antwort lautet nicht immer Ja. 

85
Henk Holterman

Ich fand das Invalidate () , das zu viel Flimmern erzeugt. Hier ist meine Situation. Ein benutzerdefiniertes Steuerelement, das ich gerade entwickle, zeichnet seine gesamten Inhalte über die Behandlung der Paint -Ereignisse.

this.Paint += this.OnPaint;

Dieser Handler ruft eine benutzerdefinierte Routine auf, die das eigentliche Malen ausführt.

private void OnPaint(object sender, PaintEventArgs e)
{
    this.DrawFrame(e.Graphics);
}

Um das Scrollen zu simulieren, möchte ich mein Steuerelement jedes Mal neu zeichnen, wenn sich der Cursor bewegt, während die linke Maustaste gedrückt wird. Meine erste Wahl war die Verwendung von Invalidate () wie folgt.

private void RedrawFrame()
{
    var r = new Rectangle(
        0, 0, this.Width, this.Height);

    this.Invalidate(r);
    this.Update();
}

Die Steuerung scrollt OK, aber flackert weit über ein komfortables Niveau hinaus. Also beschloss ich, anstatt das Steuerelement neu zu malen, meine benutzerdefinierte DrawFrame () - Methode direkt nach der Behandlung des MouseMove -Ereignisses aufzurufen. Dies führte zu einem reibungslosen Scrollen ohne Flackern.

private void RedrawFrame()
{
    var g = Graphics.FromHwnd(this.Handle);
    this.DrawFrame(g);
}

Dieser Ansatz ist möglicherweise nicht auf alle Situationen anwendbar, passt aber bisher gut zu mir.

6
user2529145

Ich denke, Sie können auch Refresh() aufrufen.

5
Brian

Rufen Sie control.invalidate auf und das Paint-Ereignis wird ausgelöst.

4
Otávio Décio

Aktualisieren würde je nach Kontext wahrscheinlich auch zu deutlich lesbarerem Code führen.

3
Simon Nunn

verwenden Sie Control.InvokePaint Sie können es auch für die manuelle Doppelpufferung verwenden

0
TheNegative