Autres articles / Other articles

Premiers tracés graphiques

publication: 14 novembre 2024 / mis à jour 20 novembre 2024

Read this page in english

 


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:

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:

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:

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:

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:

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:

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