Etendre le vocabulaire graphics pour Windows

publication: 10 mars 2023 / mis Ă  jour 10 mars 2023

Read this page in english

 


Accéder aux fonctions dans gdi32.dll

eFORTH permet l'accès aux librairies des fonctions Windows grâcce au mot dll.

Dans le code source de eForth, voici comment s'effectue la connection Ă  la librairie Gdi32:

windows definitions 
z" Gdi32.dll" dll Gdi32 

Ici, le mot Gdi32 devient le point d'entrée pour définir les mots donnant accès à cette librairie Gdi32.dll.

A partir de ce moment, chaque mot défini pour eFORTH utilisant cette librairie Gdi32 se réfère à la documentation Microsoft:
Wingdi.h - Win32 apps

Ici, on va chercher la documentation de la fonction LineTo:

Dans cette documentation, pour la fonction LineTo, il est indiqué:

Le premier réflexe, serait donc de définir le mot eFORTH LineTo comme ceci:

z" LineTo"      3 Gdi32 LineTo ( hdc x y -- fl ) 

La valeur 3 qui précède le mot Gdi32 indique que la fonction appelée doit utiliser trois paramètres.

Si on accepte d'utiliser le mot LineTo de cette manière, nous serions obligé, à chaque utilisation de procéder ainsi:

graphics internals 
: drawLines ( -- ) 
    hdc 20 20 LineTo drop 
    hdc 50 20 LineTo drop 
    hdc 50 50 LineTo drop 
    hdc 20 50 LineTo drop 
    hdc 45 45 LineTo drop 
  ; 

L'appel systématique au ticket hdc n'est pas nécessaire si on gère une seule fenêtre Windows. De même, l'utilisation de drop après LineTo alourdit le code eFORTH. La solution, pour simplifier ces mots consiste à les définir sous deux formes dans deux vocabulaires différents.

DĂ©finition des fonctions dans graphics internals

Les mots eFORTH réalisant un appel direct aux fonctions de la librairie Gdi32 seront renommés en les préfixant avec Gdi:

Tous les mots seront définis dans le vocabulaire graphics internals:

graphics internals definitions 
windows also 
 
\ The LineTo function draw a line. 
z" LineTo"      3 Gdi32 Gdi.LineTo ( hdc x y -- fl ) 
 
z" Rectangle"   5 gdi32 Gdi.Rectangle ( hdc left top right bottom -- fl ) 
 
z" Ellipse"     5 gdi32 Gdi.Ellipse ( hdc left top right bottom -- fl ) 
 
\ The CloseFigure function close a figure in a path. 
z" CloseFigure" 1 gdi32 Gdi.CloseFigure ( hdc --  fl ) 
 
\ The GetPixel function retrieves the red, green, blue (RGB) color value  
\ of the pixel at the specified coordinates. 
z" GetPixel"    3 gdi32 Gdi.GetPixel ( hdc x y -- color ) 
 
\ The SetPixel function sets the pixel at the specified coordinates  
\ to the specified color. 
z" SetPixel"    4 gdi32 Gdi.SetPixel ( hdc x y colorref -- colorref ) 

Il est aisé de vérifier la bonne compilation de ces mots dans le vocabulaire graphics internals:

Gdi.SetPixel Gdi.GetPixel Gdi.CloseFigure Gdi.Ellipse Gdi.Rectangle Gdi.LineTo
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

Ici, on a mis en évidence les nouveaux mots eFORTH connectés aux fonctions de la libraire Gdi32.

DĂ©finition des mots dans graphics

Nous allons maintenant définir des mots graphiques simplifiés dans le vocabulaire graphics:

only forth  
graphics definitions internals 
 
: lineTo ( x y -- ) 
    hdc -rot Gdi.LineTo drop ; 
: rectangle ( left top right bottom -- ) 
    >r >r >r >r hdc r> r> r> r> Gdi.Rectangle drop ; 
: closeFigure ( -- ) 
    hdc Gdi.CloseFigure drop ; 
: getPixel ( x y -- colorref ) 
    hdc -rot Gdi.GetPixel ; 
: setPixel ( x y color -- ) 
    hdc -rot Gdi.GetPixel ; 

Pour utiliser ces mots, reprenons notre exemple:

graphics 
: drawLines ( -- ) 
    20 20 lineTo 
    50 20 lineTo 
    50 50 lineTo 
    20 50 lineTo 
    45 45 lineTo 
  ; 

Pour conclure, ne cherchez pas à étendre eFORTH avec toutes les fonctions de chaque libraire. Vous y passeriez des années!

La stratégie la plus rapide et la plus simple consiste à définir exclusivement les mots exmploitant les fonctions qui vous intéressent. La programmation Windows est très complexe et nécessite l'acquisition de bases solides.


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