Frage

Ich habe einen Dialog, der die Größe. Es hat auch einen benutzerdefinierten Hintergrund, den ich als Antwort auf einen WM_ERASEBKGND Anruf male (zur Zeit ein einfacher Anruf FillSolidRect).

Wenn der Dialog der Größe verändert wird, gibt es enorme Flimmern geht. Um zu versuchen, und zu reduzieren das Flimmern ich alle untergeordneten Fenster aufzuzählen und fügen sie dem Clipping-Bereich. Das scheint ein wenig zu helfen, -. Jetzt das Flackern in alle der untergeordneten Steuerelemente meist deutlich wird, wie sie neu streichen

Wie kann ich das Dialog flimmerfreie bei der Größenänderung zu machen? Ich vermute, Double-Buffering eine Rolle spielen muss, aber ich bin nicht sicher, wie das mit untergeordnetem Steuerelemente mit einem Dialog zu tun (ohne all Kind zu machen steuert Owner-Draw oder so ähnlich).

Ich sollte anmerken, dass ich mit C ++ (nicht .NET) und MFC, obwohl reine Win32-basierten Lösungen sind willkommen:)

Hinweis: Eine Sache, die ich versuchte, die aber nicht funktioniert hat (nicht sicher, warum) war:

CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.FillSolidRect(rect, backgroundColor);

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
War es hilfreich?

Lösung

Unter der Annahme, dass „FillSolidRect“ ist das Löschen des Hintergrunds dann aus dem WM_ERASEBKGND TRUE zurück.

die doppelte Pufferung zu tun, dass Sie fast in der Code-Fragment zu tun, müssen Sie CreateCompatibleBitmap und wählen Sie die in Ihrem MemDC verwenden.

Andere Tipps

Versuchen Sie, die folgende Zeile in der Funktion OnInitDialog hinzu:

    ModifyStyle(0, WS_CLIPCHILDREN, 0);

Sie nichts in der WM_ERASEBKGND Handhabung und macht den Lösch als Teil Ihres Haupt WM_PAINT. Sie können entweder schlauer malen, so dass Sie nur die ungültigen Bereiche neu zu zeichnen, oder noch einfacher, die Zeichnung doppelt puffern.

Mit dem nichts im Lösch Hintergrund zu tun, haben Sie alle Ihre Zeichencodes an einem Ort, die es leichter machen sollten, für andere zu folgen und zu erhalten.

Wenn Sie WinXP oder höher zielen, können Sie auch den WS_EX_COMPOSITED Stil verwenden Double-Buffering für Fenster mit diesem Stil Top-Level standardmäßig zu aktivieren. Denken Sie daran, dies hat seinen eigenen Satz von Einschränkungen -. Insbesondere nicht mehr Zeichnung aus OnPaint Zyklen GetDC, etc

Sie können Parameter des Anrufs zu InvalidateRect Methode als falsch gesetzt. Dies verhindert, dass Sie WM_ERASEBKGND senden, wenn das Fenster neu gezeichnet wird. Hier ist ein schöner Link Flimmern in Fenster zu verhindern.

Doppelte Pufferung ist in der Tat der einzige Weg, um diese Arbeit zu machen.

Child Kontrollen werden für sich selbst sorgen, so lange, wie Sie sicher CLIPCHILDREN machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top