Autres articles / Other articles

Création de fenêtres avec eForth Windows

publication: 28 novembre 2024 / mis à jour 3 décembre 2024

Read this page in english

 


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:

...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:

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