Les rectangles avec eForth Windows
publication: 25 novembre 2024 / mis à jour 26 novembre 2024
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:
- lprc adresse de la structure
RECT
dont on veut modifier les coordonnées - dx décalage horizontal, positif pour un décalage vers la droite, négatif pour un décalage vers la gauche
- dy décalage vertical, positif pour un décalage vers le bas, négatif pour un décalage vers le haut
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