Wie, um flimmern zu vermeiden, während der Handhabung WM_ERASEBKGND im Windows-dialog
Ich habe einen dialog, der passt. Es hat auch eine benutzerdefinierte hintergrund, was ich Male, in Reaktion auf eine WM_ERASEBKGND Anruf (derzeit ein einfacher Aufruf FillSolidRect).
Wenn das Dialogfeld in der Größe geändert wird, gibt es enorme flackern Los. Zu versuchen und reduzieren Sie das flackern erkläre ich alle child-windows und fügen Sie Sie, um die clipping-region. Das scheint mir ein wenig helfen-das ist jetzt das flackern ist meist offensichtlich, in alle untergeordneten Steuerelemente Sie repaint.
Wie kann ich den dialog, flicker-free, während die Größe? Ich vermute, double-buffering, müssen eine Rolle spielen, aber ich bin mir nicht sicher, wie Sie dies tun, wird ein Dialogfeld mit untergeordneten Steuerelementen (ohne, dass alle untergeordneten Steuerelemente owner-draw-oder so ähnlich).
Sollte ich beachten, dass ich mit C++ (nicht .NET), MFC, wenn auch Reine Win32-basierten Lösungen sind willkommen 🙂
HINWEIS: Eine Sache, die ich versucht, aber das hat nicht funktioniert (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);
InformationsquelleAutor DougN | 2008-10-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Davon aus, dass "FillSolidRect" ist das löschen der hintergrund dann TRUE zurück, aus der WM_ERASEBKGND.
Zu tun, die doppelte Pufferung, dass Sie fast in Ihrem code-fragment, den Sie verwenden müssen, CreateCompatibleBitmap und wählen Sie, dass in Ihrem memDC.
InformationsquelleAutor
Versuchen Sie die folgende Zeile in der OnInitDialog-Funktion:
InformationsquelleAutor
Nichts in WM_ERASEBKGND Handhabung und machen das löschen als Teil Ihrer WM_PAINT. Sie können entweder malen schlauer, so dass Sie nur zeichnen das ungültige Bereiche, oder mehrere einfach -, Doppel-Puffer für die Zeichnung.
Nichts zu tun in den hintergrund löschen, müssen Sie alle Ihre Zeichnung code in einer Lage, die macht es einfacher für andere zu Folgen und zu pflegen.
InformationsquelleAutor
Wenn Sie auf WinXP oder höher, können Sie auch die WS_EX_COMPOSITED Stil zu ermöglichen, double-buffering standardmäßig für die top-level-Fenster mit diesem Stil. Bedenkt, dieser hat seinen eigenen Satz von Einschränkungen, insbesondere keine weitere Zeichnung aus der OnPaint-Zyklen mit GetDC etc.
InformationsquelleAutor
können Sie die parameter von Ihrem Aufruf von InvalidateRect Methode als falsch. Dies wird verhindern, dass Sie zu senden, WM_ERASEBKGND, wenn das Fenster neu gezeichnet. Hier ist ein netter link um zu verhindern, dass das flackern im Fenster.
InformationsquelleAutor
Doppelte Pufferung ist in der Tat der einzige Weg, um diese Arbeit zu machen.
Kind kontrolliert sich selbst aufpassen, so lange, wie Sie sicher
CLIPCHILDREN
.InformationsquelleAutor