The WM_PAINT Message
En règle générale, une application dessine une fenêtre en réponse à un message WM_PAINT . Le système envoie ce message à une procédure de fenêtre lorsque les modifications apportées à la fenêtre ont modifié le contenu de la zone cliente. Le système envoie le message uniquement s’il n’y a pas d’autres messages dans la file d’attente des messages de l’application.
Lors de la réception d’un message WM_PAINT , une application peut appeler BeginPaint pour récupérer le contexte de l’appareil d’affichage de la zone cliente et l’utiliser dans les appels aux fonctions GDI pour effectuer toutes les opérations de dessin nécessaires pour mettre à jour la zone cliente. Une fois les opérations de dessin terminées, l’application appelle la fonction EndPaint pour libérer le contexte de l’appareil d’affichage.
Avant que BeginPaint ne retourne le contexte de l’appareil d’affichage, le système prépare le contexte de l’appareil pour la fenêtre spécifiée. Il définit d’abord la zone de découpage du contexte de l’appareil pour qu’elle soit égale à l’intersection de la partie de la fenêtre qui doit être mise à jour et de la partie visible par l’utilisateur. Seules les parties de la fenêtre qui ont été modifiées sont redessinées. Les tentatives de dessin en dehors de cette région sont coupées et n’apparaissent pas à l’écran.
Le système peut également envoyer des messages WM_NCPAINT et WM_ERASEBKGND à la procédure de fenêtre avant que BeginPaint ne retourne. Ces messages dirigent l’application pour dessiner la zone non cliente et l’arrière-plan de la fenêtre. La zone non cliente est la partie d’une fenêtre qui se trouve en dehors de la zone cliente. La zone comprend des fonctionnalités telles que la barre de titre, le menu fenêtre (également appelé menu Système ) et les barres de défilement. La plupart des applications s’appuient sur la fonction de fenêtre par défaut , DefWindowProc, pour dessiner cette zone et donc passer le message WM_NCPAINT à cette fonction. L’arrière-plan de la fenêtre est la couleur ou le motif avec lequel une fenêtre est remplie avant le début des autres opérations de dessin. L’arrière-plan couvre toutes les images précédemment dans la fenêtre ou sur l’écran sous la fenêtre. Si une fenêtre appartient à une classe de fenêtre avec un pinceau d’arrière-plan de classe, la fonction DefWindowProc dessine automatiquement l’arrière-plan de la fenêtre.
BeginPaint remplit une structure PAINTSTRUCT avec des informations telles que les dimensions de la partie de la fenêtre à mettre à jour et un indicateur indiquant si l’arrière-plan de la fenêtre a été dessiné. L’application peut utiliser ces informations pour optimiser le dessin. Par exemple, il peut utiliser les dimensions de la région de mise à jour, spécifiées par le membre rcPaint , pour limiter le dessin aux seules parties de la fenêtre qui doivent être mises à jour. Si une application a une sortie très simple, elle peut ignorer la région de mise à jour et dessiner dans toute la fenêtre, en s’appuyant sur le système pour ignorer (clip) toute sortie inutile. Étant donné que le système extrait le dessin qui s’étend en dehors de la zone de découpage, seul le dessin qui se trouve dans la région de mise à jour est visible.
BeginPaint définit la région de mise à jour d’une fenêtre sur NULL. Cela efface la région, ce qui l’empêche de générer les messages WM_PAINT suivants. Si une application traite un message WM_PAINT mais n’appelle pas BeginPaint ni efface la région de mise à jour, l’application continue de recevoir WM_PAINT messages tant que la région n’est pas vide. Dans tous les cas, une application doit effacer la région de mise à jour avant de retourner à partir du message WM_PAINT .
Une fois le dessin terminé, l’application doit appeler EndPaint. Pour la plupart des fenêtres, EndPaint libère le contexte du périphérique d’affichage, le rendant disponible pour d’autres fenêtres. EndPaint affiche également le caret, s’il a été précédemment masqué par BeginPaint. BeginPaint masque le caret pour empêcher les opérations de dessin de le corrompre.
- Région de mise à jour
- Invalidation et validation de la région de mise à jour
- Récupération de la région de mise à jour
- Exclusion de la région de mise à jour
- Dessin synchrone et asynchrone