Dessin synchrone et asynchrone

La plupart des dessins effectués pendant le traitement du message WM_PAINT sont asynchrones ; Autrement dit, il existe un délai entre le moment où une partie de la fenêtre est invalidée et le moment où 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 de ce retard 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 d’entrée utilisateur et les messages susceptibles d’affecter la position ou la taille d’une fenêtre sont traités avant WM_PAINT .

Dans certains cas, une application doit dessiner de façon synchrone, c’est-à-dire dessiner dans la fenêtre immédiatement après l’invalidation d’une partie de la fenêtre. Une application classique dessine sa fenêtre main immédiatement après la création de la fenêtre pour signaler à l’utilisateur que l’application a démarré avec succès. Le système dessine certaines fenêtres de contrôle de manière synchrone, telles que les boutons, car ces fenêtres servent de focus pour l’entrée utilisateur. Bien que n’importe quelle fenêtre avec une routine de dessin simple puisse être dessinée de manière synchrone, tous ces dessins doivent être effectués rapidement et ne doivent pas interférer avec la capacité de l’application à répondre aux entrées de l’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 permet à l’application de mieux contrôler la façon de dessiner la fenêtre, par exemple s’il faut dessiner la zone non cliente et l’arrière-plan de la fenêtre ou envoyer le message, que la région de mise à jour soit vide ou non. 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.

Toutes les fenêtres nécessitant des opérations de dessin longues doivent être dessinées de manière asynchrone pour empêcher le blocage des messages en attente au fur et à 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 en un seul message WM_PAINT asynchrone, plutôt qu’une série de messages WM_PAINT synchrones.