2008-10-02 10 views
9

J'ai une boîte de dialogue qui redimensionne. Il a également un arrière-plan personnalisé que je peins en réponse à un appel WM_ERASEBKGND (actuellement un simple appel à FillSolidRect). Lorsque la boîte de dialogue est redimensionnée, le scintillement est important. Pour essayer de réduire le scintillement, j'énumère toutes les fenêtres enfants et les ajoute à la région de découpage. Cela semble aider un peu - maintenant le scintillement est surtout évident dans tous les contrôles enfants comme ils repeignent.Comment éviter le scintillement lors de la manipulation de WM_ERASEBKGND dans la boîte de dialogue Windows

Comment rendre la boîte de dialogue sans scintillement lors du redimensionnement? Je soupçonne que le double tampon doit jouer un rôle, mais je ne suis pas sûr de savoir comment le faire avec un dialogue avec les contrôles enfants (sans faire tous les contrôles enfants dessiner un propriétaire ou quelque chose comme ça).

Je dois souligner que je suis en C++ (pas .NET) et MFC, bien que pures solutions Win32 sont les bienvenus :)

NOTE: Une chose que j'ai essayé, mais qui ne fonctionne pas (non Bien sûr pourquoi) était:

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

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

Répondre

8

Si l'on suppose que « FillSolidRect » est l'effacement de l'arrière-plan, puis revenir TRUE à partir du WM_ERASEBKGND. Pour effectuer la double mise en mémoire tampon que vous êtes en train de faire dans votre fragment de code, vous devez utiliser CreateCompatibleBitmap et le sélectionner dans votre memDC.

3

Le double tampon est en effet le seul moyen de faire ce travail.

Les contrôles enfants prendront soin d'eux-mêmes tant que vous vous assurez CLIPCHILDREN.

5

Ne faites rien dans la gestion de WM_ERASEBKGND et effectuez l'effacement dans le cadre de votre WM_PAINT principal. Vous pouvez soit peindre plus intelligemment afin de redessiner uniquement les zones non valides, ou plus facilement, doubler le dessin. En ne faisant rien dans l'arrière-plan d'effacement, vous avez tout votre code de dessin dans un endroit, ce qui devrait faciliter le suivi et la maintenance par d'autres personnes.

6

Essayez d'ajouter la ligne suivante à votre fonction OnInitDialog:

ModifyStyle(0, WS_CLIPCHILDREN, 0); 
5

Si vous ciblez WinXP ou supérieur, vous pouvez également utiliser le style WS_EX_COMPOSITED pour activer le double-buffering par défaut pour les fenêtres de niveau supérieur avec ce style. Gardez à l'esprit que cela a son propre ensemble de limitations - en particulier, plus de dessiner des cycles OnPaint en utilisant GetDC, etc.

4

vous pouvez définir le paramètre de votre appel à la méthode InvalidateRect comme faux. Cela vous évitera d'envoyer WM_ERASEBKGND lorsque la fenêtre sera redessinée. Here est un bon lien pour éviter le scintillement dans la fenêtre.

Questions connexes