IV : L’affichage graphique

 

  • IV-1 : Généralités
  • Pour la plupart des utilisations, il suffit pour afficher quelque chose d’utiliser les composants VCL : TLabel pour du texte, TPanel pour des cadres, TShape pour des formes géométriques, TImage pour des images...

    Mais il arrive que cela ne suffise pas et que l’on doive dessiner " nous-mêmes " dans la fenêtre.

    Windows fournit pour cela un grand nombre de fonctions réunies dans ce qu’on appelle le GDI (Graphics Device Interface).

    Le principal problème est que l’écran n’appartient pas à notre programme : il faut donc se contenter de la zone client de sa fenêtre pour dessiner. (on peut, dans certains cas bien précis, dessiner sur tout l’écran)

    Le GDI de Windows est intéressant car il définit la notion de périphérique d’affichage indépendant. En effet, il n’y a pas que sur l’écran que l’on peut afficher : sur une imprimante, une table traçante, voir même un fichier (appelé MetaFichier). Les fonctions du GDI Windows sont les mêmes quel que soit le cas, pour tous types d’écrans ou d’imprimantes. Le GDI est indépendant du matériel, ce qui simplifie considérablement la tâche du programmeur.

    En contrepartie, le GDI régit complètement notre dessin, et on ne fait pas vraiment ce que l’on veut (comme sous DOS par exemple).

    Tout d’abord, avant de dessiner, il faut demander au système un contexte de périphérique, c’est à dire un entier identifiant celui-ci (que ce soit un écran ou une imprimante). Le système peut refuser si déjà trop de programmes demandent la même chose....

    Une fois que l’on a ce contexte, on peut dessiner à l’aide des fonctions du GDI bien sur... mais la fenêtre ne garde pas en mémoire le dessin. Pourquoi ? parce qu’à votre insu, l’utilisateur peut très bien réduire la fenêtre, la passer à l’arrière-plan, la recouvrir d’une autre... et donc effacer votre dessin ! Il faut bien retenir que les affichages ne sont pas persistants.

    Pour remédier à cela, Windows informe votre fenêtre qu’elle doit se redessiner, grâce à l’évènement OnPaint.

    Pour dessiner, on appelle donc les fonctions du GDI, mais à l’intérieur de la fonction de réponse à l’évènement OnPaint. Comme cela, chaque fois qu’il est besoin, l’affichage est refait.

    Le C++ Builder encapsule la notion de contexte de périphérique dans la classe TCanvas.

    La classe TCanvas possède tout ce qu’il faut pour dessiner dans un contexte de périphérique. Chaque fiche possède son propre TCanvas, ainsi que l’imprimante ou qu’un méta-fichier.

     

  • IV-2 : Plumes et pinceaux
  • Pour dessiner, il existe par exemple la fonction LineTo, traçant une ligne. Mais comment est tracée cette ligne ? Tout simplement à l’aide de la plume courante du TCanvas. Une plume est en fait une classe TPen regroupant tous les paramètres de tracé Windows, comme la couleur, l’épaisseur du trait ou son style.

     

    Pour peindre les surfaces, Windows utilise des pinceaux (classe TBrush). Un TCanvas contient un objet TBrush qu’il faut modifier pour personnaliser ses surfaces. Un TBrush contient des attributs de style, de couleur....

     

  • IV-3 : Images
  • Pour dessiner soi-même, plumes et pinceaux, ainsi que les fonctions du GDI comme LineTo, Rectangle suffisent. Mais si l’on veut afficher une image (photo par exemple), ces fonctions sont insuffisantes.

    Pour simplifier cette programmation, le Builder fournit un composant TImage qui permet d’utiliser celles-ci très simplement.

    Les composants TImage reconnaissent les formats BMP (mode point), ICO (icône), WMF et EMF (MetaFichiers, mode vectoriel).

    Le composant TImage se charge du chargement sur disque, de la sauvegarde, de l’affichage ainsi que de la gestion du presse-papiers.

    Un TImage possède un TCanvas, donc on peut modifier l’image (rajouter un texte, un cercle...) par-dessus.