Reduzieren Sie das Flimmern durch doppelten Puffer: SetStyle vs. überschreiben CreateParam

8

Kann jemand den Unterschied und die Beziehung zwischen

erklären? %Vor%

und

%Vor%

Sie werden benötigt, um Flackern zu reduzieren, aber wann und wie man sie richtig benutzt? Können sie einzeln verwendet werden oder müssen paarweise verwendet werden, und was ist der Grund dafür?

Danke!

Danksagungen :

Das erste Code-Snippet wurde von MSDN-Seite ; Das zweite Code-Snippet wurde in Fehlerbehebung in den Benutzersteuerelementen , der ursprüngliche Autor ist @HansPassant.

    
nevets 16.09.2014, 15:31
quelle

1 Antwort

7

Danke @terrybozzlo für Erklärung und @Caramiriel für die großartige Seite, die das Problem klärt.

Ich möchte zusammenfassen alles was ich hier bekommen habe.

Warum wir flackern

Flicker treten normalerweise auf, wenn Ihr Formular oder ein Container-Steuerelement, z. B. Panel , zu viele Steuerelemente enthält (und wenn WS_CLIPCHILDREN aktiviert ist, was standardmäßig der Fall ist). Laut @HansPassant:

  

Es zeichnet das Hintergrundbild und hinterlässt Löcher, in denen die untergeordneten Kontrollfenster verschwinden. Jedes Kindsteuerelement erhält dann eine Nachricht, um sich selbst zu malen, sie füllen das Loch mit ihrem Fensterinhalt aus. Wenn Sie viele Steuerelemente haben, sind diese Löcher für den Benutzer für eine Weile sichtbar. Sie sind normalerweise weiß und kontrastieren schlecht mit dem Hintergrundbild, wenn es dunkel ist. Oder sie können schwarz sein, wenn das Formular die Opacity- oder TransparencyKey-Eigenschaft hat, was im Gegensatz zu fast allem steht.

Wie man sie auf der Kontrollstufe vermeidet

Sie sollten die Eigenschaft DoubleBuffered des Steuerelements auf true setzen. Dazu müssen Sie das Steuerelement (wenn es kein Benutzersteuerelement ist) vom Basistyp ableiten und im Konstruktor festlegen.

Um beispielsweise Panel doppelt gepuffert zu erhalten, müssen Sie Folgendes tun:

%Vor%

Alternativ können Sie Folgendes verwenden:

%Vor%

um den identischen Effekt zu erhalten, d. h. sie sind äquivalent .

Wie vermeide ich sie auf Formularebene

Die obige Technik reduziert das Flackern auf der Steuerungsebene. Das heißt, wenn das Formular neu gezeichnet wird, flackern alle Steuerelemente nicht mehr. Die ultimative Lösung besteht jedoch darin, das Flimmern von der Formularebene zu reduzieren: Wenn das Formular neu gezeichnet wird, werden das Formular und alle untergeordneten Elemente doppelt gepuffert.

Dies erfordert das Überschreiben von CreateParams :

%Vor%

Zusammenfassung

SetStyle führt den Job auf der Steuerungsebene und CreateParam auf der Formularebene aus und erzielt einen doppelten Puffer für alle Steuerelemente innerhalb des Formulars.

Danksagungen:

@terrybozzlo, @Caramiriel, @HansPassant

    
nevets 16.09.2014, 20:55
quelle

Tags und Links