Comment éviter les scintillements lors du traitement de WM_ERASEBKGND dans la boîte de dialogue Windows

StackOverflow https://stackoverflow.com/questions/164751

Question

J'ai un 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, des scintillements énormes se produisent. Pour essayer de réduire le scintillement, é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 lorsqu'ils repeignent.

Comment puis-je rendre la boîte de dialogue sans scintillement pendant le redimensionnement? Je suppose que la double mise en tampon doit jouer un rôle, mais je ne suis pas sûr de savoir comment faire cela avec un dialogue avec des contrôles enfants (sans créer tous les contrôles enfants dessinés par le propriétaire ou quelque chose du genre).

Je dois noter que j'utilise C ++ (pas .NET) et MFC, bien que les solutions basées sur Win32 soient les bienvenues:)

NOTE: Une chose que j'ai essayée mais qui n'a pas fonctionné (je ne sais pas pourquoi) était:

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

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
Était-ce utile?

La solution

En supposant que " FillSolidRect " est l’effacement de votre fond puis retournez TRUE à partir de WM_ERASEBKGND.

Pour effectuer la double mise en mémoire tampon que vous faites presque dans votre fragment de code, vous devez utiliser CreateCompatibleBitmap et le sélectionner dans votre memDC.

Autres conseils

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

    ModifyStyle(0, WS_CLIPCHILDREN, 0);

Ne faites rien dans la gestion de WM_ERASEBKGND et effacez-le dans le cadre de votre WM_PAINT principal. Vous pouvez peindre de manière plus intelligente afin de ne redessiner que les zones non valides ou, plus facilement, mettre en double tampon le dessin.

En ne faisant rien dans l’effacement de l’arrière-plan, vous avez tout votre code de dessin au même endroit, ce qui facilitera le suivi et la maintenance pour les autres.

Si vous ciblez WinXP ou une version ultérieure, vous pouvez également utiliser le style WS_EX_COMPOSITED pour activer la mise en mémoire tampon double par défaut pour les fenêtres de niveau supérieur avec ce style. N'oubliez pas que cela a son propre ensemble de limitations - en particulier, il n'est plus nécessaire de tirer parti des cycles OnPaint avec GetDC, etc.

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

La mise en mémoire tampon est en effet le seul moyen de faire fonctionner ce travail.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top