Tutorial d'initiation A la programmation avec l'API Windows
Tutorial d'initiation a la programmation Windows avec Microsoft Visual C++
Chapitre 3Les fenêtres17. Menus
Cours théorique :
Il existe deux manières d'insérer des menus dans une application. La première méthode est de créer un menu grâce à un éditeur de ressources puis de l'insérer dans le programme. La seconde méthode est dynamique, grâce aux fonctionnalités de l'API Windows. De manière générale, les menus obtenus par des ressources seront utilisés pour les menus principaux des fenêtres, pour créer des barres de menus. Pour les menus contextuels, boîtes à outils, ..., il est préférable d'utiliser des menus dynamiques. A chaque clic dans un des menus, la fenêtre possédant le menu reçoit un message WM_COMMAND indiquant l'identifiant de l'option choisie.
Pour obtenir une barre de menus à partir d'un fichier de ressources, il suffit de créer le menu dans l'éditeur de ressources puis de passer son identifiant au membre lpszMenuName de la structure WNDCLASSEX. Le menu sera inséré automatiquement dans la fenêtre.
Pour un menu dynamique, on utilisera l'API Windows. Les menus sont identifiés par une variable HMENU. Il faut tout d'abord créer le menu. Il sera initialement vide. Pour cela, il faut utiliser la fonction CreatePopupMenu(). Une fois le menu créé, on peut lui ajouter des éléments (options, sous menus, séparateurs) avec les fonctions AppendMenu() ou InsertMenuItem(). Une fois le menu créé, il faut le dessiner. Pour cela, on utilise les fonctions TrackPopupMenu() ou TrackPopupMenuEx(). Pour une boîte à outils, il suffira de dessiner le menu à la position courante obtenue par un appel à GetCursorPos(). Si le menu est associé à une fenêtre, il sera supprimé automatiquement lors de la destruction de la fenêtre. Dans le cas contraire, l'application doit appeler la fonction DestroyMenu() pour libérer les ressources.
La fonction suivante dessine un menu contextuel :
void PrintMenu(HWND hWnd) { HMENU hMenu; POINT pt; GetCursorPos(&pt); hMenu=CreatePopupMenu(); AppendMenu(hMenu,MF_STRING,1,"Item 1"); AppendMenu(hMenu,MF_STRING,2,"Item 2"); AppendMenu(hMenu,MF_SEPARATOR,NULL,NULL); AppendMenu(hMenu,MF_STRING,3,"Item 3"); TrackPopupMenu(hMenu,NULL,pt.x,pt.y,0,hWnd,NULL); }
Dans cet exemple, les valeurs 1, 2 et 3 passées à AppendMenu() représentent les identifiants des options. Ces valeurs seront passées en paramètre lors de l'envoi du message WM_COMMAND. Elles n'ont aucune signification particulière, si ce n'est pour le programmeur lui même.
|