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
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.
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.
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:
Alternativ können Sie Folgendes verwenden:
%Vor%um den identischen Effekt zu erhalten, d. h. sie sind äquivalent .
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
:
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.
@terrybozzlo, @Caramiriel, @HansPassant