J'ai quelques fenêtres en couches dans mon application qui utilisent UpdateLayeredWindow()
pour gérer leur représentation visuelle. Selon le MSDN article on layered windows, "lorsque vous utilisez UpdateLayeredWindow()
l'application n'a pas besoin de répondre à WM_PAINT
ou d'autres messages de peinture." Ils partageaient certains des mêmes gestionnaires de messages que les fenêtres non-calques, donc je me suis dit que je reviendrais juste en début de WM_PAINT
si la cible est une fenêtre en couches.Fenêtre en couches recevant toujours le message WM_PAINT après l'appel UpdateLayeredWindow
Bien sûr, cela a causé un problème majeur: si l'une des fenêtres en couches a fait obtenir un message WM_PAINT
, la file d'attente d'entrée se retrouverait inondé par un flot ininterrompu de messages WM_PAINT
. Ce résultat final est logique, puisque la fenêtre ne sera jamais validée et donc elle continuera à penser qu'elle doit peindre (je ne devrais pas revenir du gestionnaire sans valider ou BeginPaint()
ing, etc.), mais ce que ne fait pas est logique, c'est pourquoi il a reçu le message en premier lieu, car il n'a aucun effet sur une fenêtre qui utilisait UpdateLayeredWindow()
.
Cela ne se produirait même pas de façon fiable - juste de temps en temps, et pas chaque fois que les pixels de la fenêtre avaient besoin d'être redessinés. Sanity a été restauré en retombant à DefWindowProc()
lorsqu'une fenêtre en couches a reçu un message WM_PAINT
, mais j'ai l'impression qu'il se passe quelque chose que je ne comprends pas. Et vu que ce problème se manifestait rarement, je crains que cela puisse cacher un problème encore plus subtil. Est-ce que le comportement attendu pour une fenêtre utilisant UpdateLayeredWindow()
reçoit toujours le message occasionnel WM_PAINT
? Est-ce important, tant que je le manipule correctement?
Informations supplémentaires, si nécessaire: la fenêtre appelle UpdateLayeredWindow()
immédiatement après avoir été créée, puis elle est laissée à elle-même (elle ne l'appelle plus car elle ne change pas). En utilisant C++ et Win32 API, pas de MFC.