Liste des messages liés aux menus
Le menu est défini et affiché dans votre application. Vous avez un menu dans une fenêtre, mais rien ne se passe lorsque vous cliquez sur une option...
Normal, Windows ne peut pas deviner ce que vous voulez faire avec. De même, il ne gérera pas le changement d'état des éléments d'un menu (grisé, coché...). Tout ce travail vous incombe !
Par contre, il vous informera que quelque chose peut être fait et ceci par ...(devinez !) ... messages. Vous avez attaché votre menu à une fenêtre. il y a donc une procédure de gestion des messages pour cette fenêtre. Ce sera donc là qu'il faudra gérer ces messages.
Les messages seront:
WM_INITMENU
wParam contient alors toujours le handle du menu principal même si l'utilisateur clique dans le menu système.
lParam est à 0.Existe pour donner la possibilité de changer le menu avant qu'un élément ne soit choisi, mais à part pour faire paniquer l'utilisateur, vous ne devriez pas vous en servir !
WM_MENUSELECT
Ce message sera reçu à chaque déplacement de l'utilisateur sur une option de menu.
wParam contient :item sélectionné: ID de menu contenant l'élément sélectionné ou handle de menu popupLOWORD (lparam) : Drapeau de sélections qui est une combinaison de MF_GRAYED, MF_DISABLED, MF_CHECKED, MF_BITMAP, MF_POPUP, MF_HELP, MF_SYSMENU et MF_MOUSESELECT.
HIWORD lParam : Handle du menu
A utiliser si vous voulez changer quelque chose dans la zone client en fonction du déplacement dans la barre de menu...
WM_INITMENUPOPUP
Enfin un message intéressant, puisqu'il donne la main à votre application juste avant l'affichage d'un menu. Vous pourrez changer l'état des éléments du menu pour, par exemple, désactiver ou activer une option.
wParam: Handle de menu popup
LOWORD (lParam) index popup (commençant à 0, correspond à la position dans le menu).
Il peut changer durant la phase de développement si vous refaites votre menu (ajout d'un menu popup par exemple).
HIWORD (lParam) 1 pour le menu système, 0 sinon.
Le message le plus important, puisque c'est ce message que vous recevrez lorsque l'utilisateur sélectionnera une option.
Petit problème cependant, ce message est aussi envoyer par des fenêtres enfants de type contrôle.
Il va donc falloir différencier les messages provenant d'un menu et celui d'une fenêtre enfant, surtout si les ID correspondent. Le mieux sera donc de faire en sorte que les ID soient tous différents !
Mais si des ID étaient identiques, pas de problème, tout est prévu:
LOWORD de lParam sera à 0 pour un menu, alors qu'il contient un ID de contrôle, càd le handle de la fenêtre enfant sinon.
HIWORD est à 0 pour un menu, sinon, il s'agit du code de notification d'un contrôle.wParam contient l'ID de menu.
Cf. l'exemple de code ...
Est identique à WM_COMMAND, mais pour le menu système.
wParam contient l'ID de menu, lParam sera à 0
il faudra masquer les 4 bits de poids faible pour les éléments prédéfinis du menu système:
SC_SIZE, SC_MOVE, SC_MINIMIZE, SC_MAXIMIZE, SC_NEXTWINDOW, SC_PREVWINDOW, SC_CLOSE, SC_VSCROLL, SC_HSCROLL, SC_ARRANGE, SC_RESTORE, SC_TASKLIST, SC_MOUSEMENU et SC_KEYMENUSi vous vous définissez des éléments de menu système, wParam sera égal à l'ID de menu que vous vous êtes définis.
Il faudra prévoir des valeurs < F000 pour éviter des problèmes avec ceux du système !
wParam peut aussi vous renseigner lorsque l'utilisateur sélectionne un élément de menu avec la souris ou le clavier:
wPAram à F09x si option de menu sélectionnée ia la souris
à F10x si option de menu par le clavier.
F090 correspndant à SC_MOUSEMENU et F100 à SC_KEYMENU. Il faudra donc tester la valeur de wParam en faisant :if ((wParam & 0xff0) == SC_MOUSEMENU) et idem pour le clavier...
Bon, mais à priori, vous ne devriez pas trop vous servir de ce message...
WM_MEASUREITEM et WM_DRAWITEM:
Si le style MF_OWNERDRAW est positionné, vous pourrez avoir deux autres messages avant l'affichage d'un menu, ce qui vous permettra de modifier celui-ci:
WM_MEASUREITEM : Pour connaître la taille, mais attention, d'autres objets peuvent envoyer ce message !
WPARAM wParam
lpMeasureItem = (LPMEASUREITEMSTRUCT) lParam;Voir MEASUREITEMSTRUCT
WM_DRAWITEM :
WPARAM wParam
lpDrawItem = (LPDRAWITEMSTRUCT) lParam;Voir DRAWITEMSTRUCT
Il faudra retourner TRUE si vous gérez ces messages
Enfin, WM_MENUCHAR
Ce message est envoyé si l'utilisateur fait ALT+touche non définie dans le menu ou s'il appuie sur un caractère lorsque le menu est ouvert ne correspondant pas à un raccourcie.
Wparam contient alors le code ASCII
LOWORD de lPAram : le code de sélection
HIWORD : handle de menu.Le code de sélection étant 0 pour aucun popup n'est affiché ou MF_POPUP si un popup est affiché, MF_SYSMENU si c'est un popup système qui est affiché.
Devrait être utilisé lorsque vous avez des menus avec Bitmap. Car dans ce cas, Windows ne gère pas les touches de raccourcies sur les menus items graphiques.