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_dwExStyleest en lien avec le paramètre dwExStyleCW_lpClassNameest 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
