Peinture de la fenêtre

Vous avez créé votre fenêtre. Maintenant, vous voulez montrer quelque chose à l’intérieur. Dans la terminologie Windows, il s’agit de peindre la fenêtre. Pour mélanger des métaphores, une fenêtre est un canevas vide, qui vous attend pour la remplir.

Parfois, votre programme lancera la peinture pour mettre à jour l’apparence de la fenêtre. À d’autres moments, le système d’exploitation vous avertit que vous devez repeindre une partie de la fenêtre. Dans ce cas, le système d’exploitation envoie à la fenêtre un message WM_PAINT . La partie de la fenêtre qui doit être peinte est appelée région de mise à jour.

La première fois qu’une fenêtre est affichée, toute la zone cliente de la fenêtre doit être peinte. Par conséquent, vous recevez toujours au moins un message WM_PAINT lorsque vous affichez une fenêtre.

illustration montrant la région de mise à jour d’une fenêtre

Vous êtes seul responsable de la peinture de la zone client. Le cadre environnant, y compris la barre de titre, est automatiquement peint par le système d’exploitation. Une fois que vous avez terminé de peindre la zone cliente, vous effacez la région de mise à jour, ce qui indique au système d’exploitation qu’il n’a pas besoin d’envoyer un autre message WM_PAINT tant que quelque chose ne change pas.

Supposons maintenant que l’utilisateur déplace une autre fenêtre afin qu’elle masque une partie de votre fenêtre. Lorsque la partie masquée redevient visible, cette partie est ajoutée à la région de mise à jour et votre fenêtre reçoit un autre message WM_PAINT .

illustration montrant comment la région de mise à jour change lorsque deux fenêtres se chevauchent

La région de mise à jour change également si l’utilisateur étire la fenêtre. Dans le diagramme suivant, l’utilisateur étire la fenêtre à droite. La zone nouvellement exposée à droite de la fenêtre est ajoutée à la région de mise à jour :

illustration montrant comment la région de mise à jour change lorsqu’une fenêtre est redimensionnée

Dans notre premier exemple de programme, la routine de peinture est très simple. Il remplit simplement toute la zone du client avec une couleur unie. Néanmoins, cet exemple est suffisant pour illustrer certains des concepts importants.

switch (uMsg)
{
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        // All painting occurs here, between BeginPaint and EndPaint.

        FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

        EndPaint(hwnd, &ps);
    }
    return 0;
}

Démarrez l’opération de peinture en appelant la fonction BeginPaint . Cette fonction remplit la structure PAINTSTRUCT avec des informations sur la demande de repaint. La région de mise à jour actuelle est indiquée dans le membre rcPaint de PAINTSTRUCT. Cette région de mise à jour est définie par rapport à la zone cliente :

illustration montrant l’origine de la zone cliente

Dans votre code de peinture, vous avez deux options de base :

  • Peignez l’ensemble de la zone cliente, quelle que soit la taille de la région de mise à jour. Tout ce qui se trouve en dehors de la région de mise à jour est coupé. Autrement dit, le système d’exploitation l’ignore.
  • Optimisez en peignant uniquement la partie de la fenêtre à l’intérieur de la région de mise à jour.

Si vous peignez toujours l’ensemble de la zone cliente, le code sera plus simple. Toutefois, si vous avez une logique de peinture compliquée, il peut être plus efficace d’ignorer les zones en dehors de la région de mise à jour.

La ligne de code suivante remplit la région de mise à jour avec une seule couleur, à l’aide de la couleur d’arrière-plan de la fenêtre définie par le système (COLOR_WINDOW). La couleur réelle indiquée par COLOR_WINDOW dépend du jeu de couleurs actuel de l’utilisateur.

FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

Les détails de FillRect ne sont pas importants pour cet exemple, mais le deuxième paramètre donne les coordonnées du rectangle à remplir. Dans ce cas, nous transmettons l’ensemble de la région de mise à jour (le membre rcPaint de PAINTSTRUCT). Sur le premier WM_PAINT message, toute la zone cliente doit être peinte, de sorte que rcPaint contiendra l’ensemble de la zone cliente. Dans les messages WM_PAINT suivants, rcPaint peut contenir un rectangle plus petit.

La fonction FillRect fait partie de l’interface GDI (Graphics Device Interface), qui a alimenté les graphiques Windows depuis très longtemps. Dans Windows 7, Microsoft a introduit un nouveau moteur graphique, nommé Direct2D, qui prend en charge les opérations graphiques hautes performances, telles que l’accélération matérielle. Direct2D est également disponible pour Windows Vista via platform Update pour Windows Vista et pour Windows Server 2008 via la mise à jour de plateforme pour Windows Server 2008. (GDI est toujours entièrement pris en charge.)

Une fois la peinture terminée, appelez la fonction EndPaint . Cette fonction efface la région de mise à jour, ce qui signale à Windows que la fenêtre a terminé la peinture elle-même.

Suivant

Fermeture de la fenêtre