Création de fenêtres avec eForth Windows
publication: 28 novembre 2024 / mis à jour 3 décembre 2024
Les fenêtres de l'API Windows sont importantes pour tout développement d'interfaces interactifs, affichage de textes, graphiques, images...
Il faut voir une fenêtre de l'API comme une table qui sera utilisée pour manger le repas, ou dessiner, bricoler, etc.

L'API Windows utilise beaucoup de type de fenêtres: saisie de texte, listes déroulantes, etc. Nous allons tenter d'approfondir ces possibilités.
Ouverture d'une fenêtre avec le mot window
Il existe déjà le mot window
pour ouvrir une nouvelle fenêtre. Ce mot est
défini dans le vocabulaire graphics
:
graphics 600 400 window
Ceci ouvre une fenêtre de 600 pixels de large sur 400 pixels de haut.
Tous les paramètres de window
sont prédéfinis. Au coeur de window,
c'est le mot CreateWindowExA
qui crée la fenêtre.
Le mot CreateWindowExA
Le mot CreateWindowExA utilise 12 paramètres. Ici la fonction écrite en langage C. Les paramètres apparaisset en gras:
HWND CreateWindowExA( [in] DWORD dwExStyle, [in, optional] LPCSTR lpClassName, [in, optional] LPCSTR lpWindowName, [in] DWORD dwStyle, [in] int X, [in] int Y, [in] int nWidth, [in] int nHeight, [in, optional] HWND hWndParent, [in, optional] HMENU hMenu, [in, optional] HINSTANCE hInstance, [in, optional] LPVOID lpParam );
Ce sont les mêmes paramètres utilisés par le mot CreateWindowExA
dans eForth Windows.
Mais avant de voir ces paramètres en détail, quelques explications sur le handle de gestion de fenêtre.
Les handles de fenêtre sous eForth Windows
Beaucoup de fonctions de l'API Windows utilisent des handles. Un handle est une sorte d'étiquette qui individualise
des objets de l'API Windows. Ce ne sont pas des objets au sens programmation objet. Dans l'API Windows, si on ouvre
plus d'une fenêtre, chaque fenêtre doit avoir son handle, par exemple hwnd1
et hwnd2
. Si on veut
agir sur le contenu d'une de ces fenêtres, il faut utiliser le handle correspondant à la fenêtre à laquelle on s'adresse.
Supposons qu'on aie défini un mot create-window
, ce mot va empiler le handle d'une fenêtre:
\ pre-define handles for two windows 0 value hwnd1 0 value hwnd2 .... \ set handles for this two windows create-window to hwnd1 create-window to hwnd2
Ensuite, pour afficher l'une de ces fenêtre, on va utiliser le mot show-window
dont voici la définition:
: show-window ( hwnd -- ) >r r@ SW_SHOWNORMAL ShowWindow drop r> SetForegroundWindow drop ; hwnd2 show-window \ display second window
Passage des paramètres au mot CreateWindowExA
L'utilisation du mot window
déjà défini dans le vocabulaire graphics
ne convient pas pour ouvrir d'autres
types de fenêtres en dehors d'une fenêtre classique. On définit un ensemble de valeurs permettant d'injecter les paramètres
attendus pour CreateWindowExA
:
NULL value CW_dwExStyle myclass value CW_lpClassName MyWindowName value CW_lpWindowName WS_OVERLAPPEDWINDOW value CW_dwStyle create CW_WidthHeight RECT allot CW_WidthHeight 10 10 640 480 SetRect drop NULL value CW_hWndParent NULL value CW_hMenu hinst value CW_hInstance NULL value CW_lpParam
Ici, on a défini huit valeurs et une structure RECT
nommée CW_WidthHeight
. Le nom de chaque valeur
est préfixé CW_ pour Create Window. Ainsi, en relisant plus tard le programme, on verra facilement nos paramètres:
CW_dwExStyle
est en lien avec le paramètre dwExStyleCW_lpClassName
est en lien avec le paramètre lpClassName
...etc.
Voici comment définir notre mot create-window
:
: create-window ( -- hwnd )
CW_dwExStyle
CW_lpClassName
CW_lpWindowName
CW_dwStyle
CW_WidthHeight GetRect
CW_hWndParent
CW_hMenu
CW_hInstance
CW_lpParam
CreateWindowExA
;
L'exécution de create-window
empile le handle de la fenêtre créée. Ce handle doit être enregistré
pour pouvoir être utilisé par les mots agissant sur le contenu de cette nouvelle fenêtre.
Details des paramètres de CreateWindowExA
Nous allons détailler le rôle de chaque paramètre passé à CreateWindowExA
. Les paramètres sont repris dans
l'ordre d'utilisation.
dwExStyle
Contrôle le style de fenêtre étendu de la fenêtre en cours de création.
lpClassName
Spécifie le nom de la classe de fenêtre.
lpWindowName
Nom de la fenêtre. Si le style de fenêtre spécifie une barre de titre, le titre de la fenêtre pointé par lpWindowName s'affiche dans la barre de titre.
dwStyle
Style de la fenêtre en cours de création. Ce paramètre peut être une combinaison des valeurs de style de fenêtre.
X Y nWidth nHeight
Quatre paramètres:
- X position depuis le bord gauche de l'écran de l'affichage de la fenêtre
- Y position depuis le bord supérieur de l'écran de l'affichage de la fenêtre
- nWidth largeur de la fenêtre
- nHeight hauteur de la fenêtre
Dans create-window
, ces quatre paramètres sont gérés au travers d'une structure RECT
. Exemple:
CW_WidthHeight 50 20 800 600 SetRect drop
Prépare une fenêtre de 800 par 600 pixels.
Legal: site web personnel sans commerce / personal site without seling