8 Stimmen

Wie beseitigt man Flackern in Windows.Forms benutzerdefinierten Steuerelement beim Scrollen?

Ich möchte ein benutzerdefiniertes Steuerelement in C# erstellen. Aber jedes Mal, wenn ich mein Steuerelement vollständig neu zu zeichnen, flackert es, auch wenn ich doppelte Pufferung (Zeichnung auf ein Bild zuerst, und blitting, dass) verwenden.

Wie kann ich das Flimmern beseitigen, wenn ich vollständig neu zeichnen muss?

13voto

Shaun Austin Punkte 3697

Sie könnten versuchen, das Folgende in Ihren Konstruktor nach dem InitiliseComponent-Aufruf einzufügen.

SetStyle(ControlStyles.OptimizedDoubleBuffer | 
         ControlStyles.UserPaint |
         ControlStyles.AllPaintingInWmPaint, true);

EDIT:

Wenn Sie das ausprobieren wollen, sollten Sie Ihren eigenen Code für die doppelte Pufferung entfernen und das Steuerelement einfach selbst zeichnen lassen, wenn die entsprechenden virtuellen Methoden aufgerufen werden.

8voto

Brad Bruce Punkte 7435

Ich habe dies aus einem funktionierenden C#-Programm. Andere Poster haben Syntaxfehler und eindeutig aus C++ statt aus C# kopiert

SetStyle(ControlStyles.OptimizedDoubleBuffer | 
                        ControlStyles.UserPaint |
                        ControlStyles.AllPaintingInWmPaint, true);

1voto

Eric W Punkte 552

Es kann genügen, einfach die

SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true);

Das Flackern, das Sie sehen, ist höchstwahrscheinlich darauf zurückzuführen, dass Windows zuerst den Hintergrund des Steuerelements zeichnet (über WM_ERASEBKGND) und dann Ihr Steuerelement auffordert, das zu zeichnen, was Sie tun müssen (über WM_PAINT). Durch die Deaktivierung der Hintergrundfarbe und tun alle Malerei in Ihrem OnPaint überschreiben kann das Problem in 99% der Fälle zu beseitigen, ohne die Notwendigkeit, alle den Speicher für doppelte Pufferung benötigt zu verwenden.

0voto

Grokys Punkte 15823

Du sagst, du hast es mit doppelter Pufferung versucht, aber dann sagst du, dass du zuerst auf ein Bild zeichnest und dieses blittest. Haben Sie versucht, die Einstellung DoubleBuffered = true in den Konstruktor, anstatt es selbst mit einem Bild zu tun?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X