[.NET 2.0] Flackern bei Paint-Ereignis

Sunray

Erfahrenes Mitglied
Hi,
ich bastle gerade an einem Programm, das mir verschiedene Grafiken in ein und demselben Fenster zeichnet. Was genau gezeichnet wird, hängt ganz vom Input (Konsole, XML-File usw.) ab. Daher kann ich im voraus nicht wissen, was GDI zeichnen soll.

Damit das Fenster auch schön brav neu gezeichnet wird, malt GDI bei der Berechnung in ein Bitmap, welches dann im Paint-Ereignis der Formulars angezeigt wird.
Wenn ich allerdings die Grösse des Fensters verändere (wobei das Bild natürlich angepasst/verzerrt wird), beginnt die Flackerei (der weisse Hintergrund wird ganz kurz sichtbar).

Das Problem scheint zu sein, dass mein Zeichenbereich schon vor dem Paint-Ereignis gelöscht wird.
Kennt jemand eine Möglichkeit, dies zu verhindern?

(Ich programmiere in VB.NET für .NET 2.0)
 
Naja, beim Resizen wird der Inhalt neu gezeichnet.

Wirf mal den folgenden Code in den Constructor deiner Form

Code:
SetStyle( ControlStyles.UserPaint, true );
SetStyle( ControlStyles.AllPaintingInWmPaint, true );
SetStyle( ControlStyles.DoubleBuffer, true );
 
Hat nichts geholfen..

DoubleBuffer funktioniert aus irgend einem Grund nicht. Ich erhalte eine InvalidArgument Exception von der Application.Run Methode.

Es soll beim Resizen ja auch neu gezeichnet werde aber erst, wenn das "Bild" angepasst wurde. Das alte Bild soll so lange sichtbar bleiben bis das neue Bild verfügbar ist.

Gibt es irgend ein Event, das mir sagt, wann es nötig ist mein Fenster neu zu zeichnen.
Hat das irgendwas mit "Validierung" zu tun?
 
Ich hab die Lösung!

Ich habe in meinem Formular einfach die onPaintBackground-Methode überschreiben, die eigentlich das PaintBackground-Ereignis auslösen würde.
Somit wird der Hintergrund eben nicht gezeichnet, bevor das Paint-Ereignis ausgelöst wird, was mir die Möglichkeit gibt, das neuzeichnen so lange wie nötig herauszuzögern.

Allerdings habe ich jetzt ein anderes Problem. Folgender Code generiert ab und zu eine InvalidOperationException mit der Meldung, ich würde das Formular aus einem anderen Thread heraus ändern, als es erstellt wurde. Ok, darauf war ich vorbereitet. Deswegen auch das If InvokeRequired. Und Trotzdem taucht dieser Fehler immer noch auf... SyncLock kann ich ja nicht verwenden, da ich mich dann mit einem DeadLock konfrontiert sähe...

Code:
If Me.InvokeRequired Then
    Me.Invoke(New Champ.Framework.voidSimpleCall(AddressOf changeResizeLevel))
    Exit Sub
End If
Select Case RLevel
    Case ResizingLevel.explicit
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedToolWindow
    Case ResizingLevel.final
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.SizableToolWindow
     Case ResizingLevel.implicit
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.SizableToolWindow
End Select
 

Neue Beiträge

Zurück