Autres articles / Other articles

Les rectangles avec eForth Windows

publication: 25 novembre 2024 / mis à jour 26 novembre 2024

Read this page in english

 


La structure RECT

Un rectangle est défini par ses coordonnées minimales et maximales sur les deux axes, qui correspondent à ses coins supérieur gauche et inférieur droit dans l'espace de coordonnées du périphérique. Lorsqu'on utilise des fonctions utilisant la structure RECT, la valeur gauche est moins grande que la droite, le haut est moins grand que le bas. Les pointeurs de type RECT transmis sont également supposés être valides.

La structure RECT est déjà définie dans eForth Windows:

struct RECT 
  i32 field ->left 
  i32 field ->top 
  i32 field ->right 
  i32 field ->bottom 

Lors de son exécution, le mot RECT empile simplement la taille de la structure, ici 4x32 bits, soit 4x4 octets. Utilisation:

create lpRect 
    RECT allot 

Pour affecter des valeurs à lpRect, il suffit d'utiliser le mot SetRect, dont voici la définition:

\ sets the coordinates of the specified rectangle 
z" SetRect"         5 User32 SetRect    ( LPRECT xLeft yTop xRight yBottom -- fl ) 

Il n'existe aucune fonction inverse nommée GetRect. Mais il est facile de définir un mot Forth Getrect:

\ get the coordinates of the specified rectangle 
: GetRect  ( LPRECT -- left top right bottom ) 
    >r 
    r@ ->left   SL@ 
    r@ ->top    SL@ 
    r@ ->right  SL@ 
    r> ->bottom SL@ 
  ; 

Nous avions déjà abordé le mot Rectangle dans un autre chapitre. Pour rappel, ce mot dessine une zone rectangulaire définie par ses quatres paramètres. Exemple:

: drawRects 
    hdc RECT01 GetRect Rectangle drop 
    hdc HPEN_RED    SelectObject drop 
    hdc HBRUSH_BLUE SelectObject drop 
    hdc RECT02 GetRect Rectangle drop 
  ; 

Résultat:

Le mot Rectangle est lié à la fonction Rectangle de la librairie GDI.

Mais il existe d'autres fonctions pour gérer des rectangles, ce depuis la libraire User. Ce sont ces fonctions que nous allons lier et exploiter.

Les zones rectangulaires

La première utilisation de zones rectangulaires a déjà été décrite quand on a utilisé Drawtext. Rappel:

: STR01 ( -- addr len ) 
    s" In this example, I draw a very long text in this graphic window." ; 
hdc lpchText1 RECT01 DT_TOP DT_WORDBREAK OR DT_CENTER OR DrawTextA drop 

Ici, le texte s'affichera dans un rectangle ayant les limites définies dans la structure RECT01. On va colorer le rectangle en gris léger avec le mot FillRect. Ce mot est déjà défini dans eForth Windows.

Exemple:

$df $df $df RGB constant COLOR_LIGHT_GREY 
 
: setBrushes  ( -- ) 
    $00 $00 $FF RGB CreateSolidBrush to HBRUSH_BLUE 
    $FF $00 $00 RGB CreateSolidBrush to HBRUSH_RED 
    COLOR_LIGHT_GREY CreateSolidBrush to HBRUSH_LIGHTGREY 
  ; 
 
: DRAWtext  ( -- ) 
    hdc $CF $00 $00 RGB setTextColor drop   \ text in dark RED 
    hdc COLOR_LIGHT_GREY SetBkColor drop    \ text in dark RED 
    hdc RECT01 HBRUSH_LIGHTGREY FillRect drop 
    hdc STR01 RECT01 FORMATTING DrawTextA drop 
  ; 

Résultat:

Le rectangle est défini par FillRect. Puis seulement après, on affiche le texte en rouge foncé avec DrawTextA.

Déplacer un rectangle

Pour déplacer un rectangle, point besoin d'agir directement dans les données d'une structure RECT. Il suffit d'exécuter OffsetRect dont voici la définition:

\ move RECT structure 
z" OffsetRect"  3 User32 OffsetRect   ( lprc dx dy -- fl ) 

Paramètres:

L'action de OffsetRect modifie les données dans la structure cible.

Exemple:

RECT01 10 10 OffsetRect drop 

Déplace les coordonnées de RETC01 de 10 unités vers la droite et vers le bas.

Savoir si un point est dans un rectangle

A tout moment, il peut être utile de savoir si un point est situé dans un rectangle. Pour ce faire, on va utiliser le mot PtInRect dont voici la définition:

RECT01 10 10 OffsetRect drop 

Legal: site web personnel sans commerce / personal site without seling