Partager via


Dessin synchrone et asynchrone

La plupart des dessins effectués pendant le traitement du message WM_PAINT sont asynchrones ; autrement dit, il y a un délai entre le moment où une partie de la fenêtre est invalidée et l’heure à laquelle WM_PAINT est envoyé. Pendant le délai, l’application récupère généralement les messages de la file d’attente et effectue d’autres tâches. La raison du délai est que le système traite généralement le dessin dans une fenêtre comme une opération de faible priorité et fonctionne comme si les messages et messages d’entrée utilisateur susceptibles d’affecter la position ou la taille d’une fenêtre seront traités avant WM_PAINT.

Dans certains cas, il est nécessaire qu’une application dessine de façon synchrone c’est-à-dire dessiner dans la fenêtre immédiatement après avoir invalidé une partie de la fenêtre. Une application classique dessine sa fenêtre principale immédiatement après avoir créé la fenêtre pour signaler à l’utilisateur que l’application a démarré correctement. Le système dessine de manière synchrone certaines fenêtres de contrôle, telles que les boutons, car ces fenêtres servent de focus pour l’entrée utilisateur. Bien qu’une fenêtre avec une routine de dessin simple puisse être dessinée de manière synchrone, tout ce dessin doit être effectué rapidement et ne doit pas interférer avec la capacité de l’application à répondre à l’entrée utilisateur.

Les fonctions UpdateWindow et RedrawWindow permettent un dessin synchrone. UpdateWindow envoie un message WM_PAINT directement à la fenêtre si la région de mise à jour n’est pas vide. RedrawWindow envoie également un message WM_PAINT, mais donne à l’application un meilleur contrôle sur la façon de dessiner la fenêtre, par exemple s’il faut dessiner la zone et l’arrière-plan de la fenêtre non cliente ou s’il faut envoyer le message, que la région de mise à jour soit vide. Ces fonctions envoient le message WM_PAINT directement à la fenêtre, quel que soit le nombre d’autres messages dans la file d’attente des messages de l’application.

Toute fenêtre nécessitant des opérations de dessin fastidieuses doit être dessinée de manière asynchrone pour empêcher les messages en attente d’être bloqués à mesure que la fenêtre est dessinée. En outre, toute application qui invalide fréquemment de petites parties d’une fenêtre doit permettre à ces parties non valides de se consolider dans un message de WM_PAINT asynchrone unique, plutôt qu’une série de messages WM_PAINT synchrones.