Premiers tracés graphiques
publication: 14 novembre 2024 / mis à jour 20 novembre 2024
Les Interfaces de Programmation d'Application (API) de l'environnement Windows sont très complexes. La maitrise de ces API est essentiel pour réaliser des programmes fonctionnant ailleurs que dans un simple terminal texte. Pour être très cash, c'est une "usine à gaz", pour le dire poliment.
Les fervents zélotes de Linux seraient tentés d'affirmer que Linux serait plus simple. J'exprime quelques doutes sur ce point, au vu de certains coeds sources Linux. En réalité, les deux systèmes, Windows et Linux, ont des démarches similaires pour ce qui est de gérer des environnements graphiques.
Je vais donc tenter d'aborder ce vaste sujet par paliers, en espérant ne pas vous perdre en cours de route.
Ouvrir une fenêtre
Le premier mot à connaître, pour ouvrir une fenêtre graphique, est window
. Ce mot accepte deux paramètres:
- largeur de la fenêtre, exprimée en pixels;
- hauteur de la fenêtre, exprimée en pixels.
Exemple:
graphics 600 400 window
Ceci ouvre une fenêtre de 640 pixels de large et 400 pixels de haut. Cette fenêtre est indépendante de la fenêtre eForth Windows.
Ici, le mot graphics
sélectionne le vocabulaire graphics
. Contenu de ce vocabulaire:
flip poll wait window heart vertical-flip viewport scale translate }g g{ screen>g box color pressed? pixel height width event last-char last-key mouse-y mouse-x RIGHT-BUTTON MIDDLE-BUTTON LEFT-BUTTON FINISHED TYPED RELEASED PRESSED MOTION EXPOSED RESIZED IDLE internals
Une partie des primitives sont définies dans le vocabulaire internals
:
graphics internals vlist \ display:
GrfWindowProc msg>pressed msg>button rescale binfo msgbuf ps hdc hwnd GrfClass
hinstance GrfWindowTitle GrfClassName raw-heart heart-ratio heart-initialize
cmax! cmin! heart-end heart-start heart-size heart-steps heart-f raw-box
g> >g gp gstack hline ty tx sy sx key-state! key-state key-count backbuffer
Dans le précédent article, Etendre le vocabulaire graphics pour Windows, on a déjà abordé la manière d'étendre le contenu de ces deux vocabulaires.
Tracé de lignes
L'ouverture d'une fenêtre avec window
, stocke le handle de l'environnement courant dans la
valeur hdc
.
Avant d'effectuer un tracé, on positionne le pointeur graphique avec MoveToEx
, dont voici la définition:
\ MoveToEx updates the current position z" MoveToEx" 4 Gdi32 MoveToEx ( hdc x y LPPOINT -- fl )
Paramètres de MoveToEx
:
- hdc Handle vers un contexte de périphérique
- x Spécifie la coordonnée x, en unités logiques, de la nouvelle position
- y Spécifie la coordonnée y, en unités logiques, de la nouvelle position
- LPPOINTPointeur vers une structure
POINT
qui reçoit la position actuelle précédente. Si ce paramètre est un pointeurNULL
, la position précédente n’est pas retournée
Exemple:
hdc 20 20 NULL moveToEx drop
Ici on a positionné le pointeur graphique aux coordonnées 20 20. De base, cette position correspond à 20 pixels depuis le bord haut et le bord gauche
de la fenêtre courante. On va maintenant faire quelques tracés depuis cette position, avec le mot LineTo
dont voici d'abord la définition:
\ LineTo draws a line from the current position to, \ but not including, the specified point. z" LineTo" 3 Gdi32 LineTo ( hdc x y -- fl )
Paramètres de LineTo
:
- hdc Handle vers un contexte de périphérique
- x Spécifie la coordonnée x, en unités logiques, de la nouvelle position
- y Spécifie la coordonnée y, en unités logiques, de la nouvelle position
Exemple:
windows also graphics internals : draw hdc 20 20 NULL moveToEx drop hdc 90 20 LineTo drop hdc 90 50 LineTo drop hdc 20 90 LineTo drop hdc 20 20 LineTo drop ; : run09 600 400 window draw key drop bye ;
Résultat:
La couleur de tracé, par défaut, est noir.
Coloration des tracés graphiques
Avec WinCGI, rien n'est simple,a mais tout est logique. Et le changement de couleur fait partie de cette immense usine à gaz que l'on va tenter de maitriser.
Pour modifier la couleur d'une ligne tracée avec LineTo
, vous devez définir la couleur
du stylo (pen) avant d'exécuter LineTo
.
On définit préalablement un stylo, avec le mot CreatePen
, dont voici la définition:
z" CreatePen" 3 Gdi32 CreatePen ( iStyle cWidth color -- hPen )
L'exécution de CreatePen
nécessite ces paramètres:
- iStyle style du tracé
- cWidth épaisseur du tracé
- color couleur du tracé
En retour, on récupère un handle nécessaire pour sélectionner le stylo. Exemple:
0 constant PS_SOLID 0 value HPEN_RED PS_SOLID 1 $FF $00 $00 RGB CreatePen to HPEN_RED
Ici, on a défini une valeur HPEN_RED
qui stocke le handle issu de l'exécution de CreatePen
.
On peut facilement définir plusieurs stylos:
0 value HPEN_RED
0 value HPEN_BLUE
: setPens ( -- )
PS_SOLID 3 $FF $00 $00 RGB CreatePen to HPEN_RED
PS_DOT 1 $00 $00 $FF RGB CreatePen to HPEN_BLUE
;
Ici, on définit deux stylos dont les handles sont stockés dans HPEN_RED
et HPEN_BLUE
.
Pour sélectionner un stylo, on passe par son handle en utilisant le mot SelectObject
dont voici la définition:
z" SelectObject" 2 Gdi32 SelectObject ( hdc h -- fl )
Paramètres:
- hdc handle pour le contrôleur de domaine
- h handle de l’objet à sélectionner.
Utilisation:
: draw setPens hdc HPEN_RED SelectObject drop hdc 20 20 NULL moveToEx drop hdc 90 20 LineTo drop hdc 90 50 LineTo drop hdc 20 90 LineTo drop hdc 20 20 LineTo drop hdc HPEN_BLUE SelectObject drop hdc 25 25 NULL moveToEx drop hdc 95 25 LineTo drop hdc 95 55 LineTo drop hdc 25 95 LineTo drop hdc 25 25 LineTo drop ;
Résultat:
En résumé, voici les étapes pour colorer un tracé simple:
- définir un stylo avec
CreatePen
- sélectionner un stylo avec
SelectObject
- faire le tracé graphique
Dans l'exemple ci-dessus, le tracé bleu est en pointillé. En fait, derrière l'apparente complexité sur la manière de gérer les tracés et couleurs de tracés, nous n'avons plus à re-créer une librairie graphique en Forth.
Legal: site web personnel sans commerce / personal site without seling