Sur Win32, puis-je désactiver la peinture d'une fenêtre pendant un certain temps?
Question
Y a-t-il une fonction qui gèlera la réintention de repeindre pendant un certain temps, pendant que je modifie la disposition de ma boîte de dialogue?
La solution
Si vous constatez que vous devez réellement le faire, vous devez envoyer la fenêtre un WM_SETREDRAW
message avec le wParam
réglé sur false. Cela indique que la fenêtre ne doit pas être redessinée après la modification de son contenu.
Lorsque vous souhaitez réactiver le dessin, envoyez un autre WM_SETREDRAW
message, cette fois avec le wParam
réglé sur true.
Exemple de code:
// Disable window updates
SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);
// Perform your layout here
// ...
// Re-enable window updates
SendMessage(hWnd, WM_SETREDRAW, TRUE, 0);
Pour plus d'informations, L'article de blog de Raymond Chen sur le sujet est une excellente lecture.
Autres conseils
Vous devriez faire le repositionnement en un seul swoop; utilisation Begindeferwindowpos et al.
La façon dont Windows peint est que le système publie votre fenêtre WM_PAINT
Messages vous demandant de peindre. Vous pouvez choisir d'ignorer ces messages si vous le souhaitez, pendant que vous modifiez la disposition, puis forcer un cycle de peinture une fois que vous avez terminé la modification de la disposition.
Cependant, mon expérience de l'interface utilisateur sur les fenêtres est que vous n'avez généralement pas besoin de prendre de telles mesures. Étant donné que vous êtes chargé de pomper votre file d'attente de messages, si la fenêtre est actualisée pendant que vous êtes en train de modifier la mise en page, vous devez avoir pris des mesures qui ont conduit à la file d'attente de messages.
En termes simples, arrêtez de pomper la file d'attente tout en modifiant la disposition et vos problèmes disparaîtront.