Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Un menu est une liste d’éléments qui spécifient des options ou des groupes d’options (sous-menu) pour une application. Cliquer sur un élément de menu ouvre un sous-menu ou provoque l’exécution d’une commande par l’application. Cette section fournit des informations sur les rubriques suivantes :
- Barres de menus et menus
- Accès au clavier aux menus
- Création de menu
-
Éléments de menu
- Éléments de commande et éléments qui ouvrent les sous-menus
- identificateur deMenu-Item
- position deMenu-Item
- Accès aux éléments de menu par programmation
- Éléments de menu par défaut
- Éléments de menu sélectionnés et effacés
- Éléments de menu activés, grisés et désactivés
- Éléments de menu mis en surbrillance
- éléments de menuOwner-Drawn
- Séparateurs d’éléments de menu et sauts de ligne
- Messages utilisés avec les menus
- Menu Suppression
Barres de menus et menus
Un menu est organisé dans une hiérarchie. Au niveau supérieur de la hiérarchie est la barre de menus ; qui contient une liste de menus, qui à son tour peut contenir des sous-menus. Une barre de menus est parfois appelée menu de niveau supérieur, et les menus et sous-menus sont également appelés menus contextuels.
Un élément de menu peut effectuer une commande ou ouvrir un sous-menu. Un élément qui exécute une commande est appelé un élément de commande ou une commande.
Un élément de la barre de menus ouvre presque toujours un menu. Les barres de menus contiennent rarement des éléments de commande. Lorsqu'un menu est ouvert à partir de la barre de menus, il se déploie sous celle-ci et est parfois appelé menu déroulant. Lorsqu’un menu déroulant s’affiche, il est attaché à la barre de menus. Un élément de menu dans la barre de menus qui ouvre un menu déroulant est également appelé nom de menu.
Les noms de menus d’une barre de menus représentent les principales catégories de commandes qu’une application fournit. La sélection d’un nom de menu dans la barre de menus ouvre généralement un menu dont les éléments de menu correspondent aux commandes d’une catégorie. Par exemple, une barre de menus peut contenir un nom de menu Fichier qui, lorsque vous cliquez sur l’utilisateur, active un menu avec des éléments de menu tels que Nouveau, Ouvrir et Enregistrer. Pour obtenir des informations sur une barre de menus, appelez GetMenuBarInfo.
Seule une fenêtre contextuelle ou superposée peut contenir une barre de menus ; une fenêtre enfant ne peut pas en contenir une. Si la fenêtre a une barre de titre, le système positionne la barre de menus juste en dessous. Une barre de menus est toujours visible. Toutefois, un sous-menu n’est pas visible tant que l’utilisateur n’a pas sélectionné un élément de menu qui l’active. Pour plus d’informations sur les fenêtres contextuelles et superposées, consultez Types de fenêtres.
Chaque menu doit avoir une fenêtre propriétaire. Le système envoie des messages à la fenêtre propriétaire d’un menu lorsque l’utilisateur sélectionne le menu ou choisit un élément dans le menu.
Cette section décrit les rubriques suivantes.
Menus contextuels
Le système fournit également des menus contextuels. Un menu contextuel n’est pas attaché à la barre de menus ; il peut apparaître n’importe où à l’écran. Une application associe généralement un menu contextuel à une partie d’une fenêtre, telle que la zone cliente ou un objet spécifique, tel qu’une icône. Pour cette raison, ces menus sont également appelés menus contextuels.
Un menu contextuel reste masqué jusqu’à ce que l’utilisateur l’active, généralement en cliquant avec le bouton droit sur une sélection, une barre d’outils ou un bouton de barre des tâches. Le menu est généralement affiché à la position du curseur de la souris ou du caret.
Menu Fenêtre
Le menu Fenêtre (également appelé menu Système ou menu Contrôle ) est un menu contextuel défini et géré presque exclusivement par le système d’exploitation. L’utilisateur peut ouvrir le menu de la fenêtre en cliquant sur l’icône de l’application dans la barre de titre ou en cliquant avec le bouton droit n’importe où dans la barre de titre.
Le menu Fenêtre fournit un ensemble standard d’éléments de menu que l’utilisateur peut choisir de modifier la taille ou la position d’une fenêtre, ou de fermer l’application. Les éléments du menu fenêtre peuvent être ajoutés, supprimés et modifiés, mais la plupart des applications utilisent simplement l’ensemble standard d’éléments de menu. Une fenêtre contextuelle ou une fenêtre enfant superposée peut avoir un menu fenêtre. Il est rare qu’une fenêtre contextuelle ou superposée n’inclue pas de menu fenêtre.
Lorsque l’utilisateur choisit une commande dans le menu Fenêtre , le système envoie un message WM_SYSCOMMAND à la fenêtre propriétaire du menu. Dans la plupart des applications, la procédure de fenêtre ne traite pas les messages du menu fenêtre. Au lieu de cela, il transmet simplement les messages à la fonction DefWindowProc pour le traitement par défaut du message. Si une application ajoute une commande au menu fenêtre, la procédure de fenêtre doit traiter la commande.
Une application peut utiliser la fonction GetSystemMenu pour créer une copie du menu de fenêtre par défaut à modifier. Toute fenêtre qui n’utilise pas la fonction GetSystemMenu pour effectuer sa propre copie du menu fenêtre reçoit le menu de fenêtre standard.
Identificateur d’aide
Un identificateur d'aide est associé à chaque barre de menus, menu, sous-menu et menu contextuel. Si l’utilisateur appuie sur la touche F1 pendant que le menu est actif, cette valeur est envoyée à la fenêtre propriétaire dans le cadre d’un message WM_HELP .
Accès au clavier aux menus
Le système fournit une interface clavier standard pour les menus. Vous pouvez améliorer cette interface en fournissant des touches d’accès mnemoniques et des touches de raccourci (accélérateur) pour vos éléments de menu.
Les rubriques suivantes décrivent l’interface clavier standard, les touches d’accès et les touches de raccourci :
Interface clavier standard
Le système est conçu pour fonctionner avec ou sans souris ou autre appareil pointant. Étant donné que le système fournit une interface clavier standard, l’utilisateur peut utiliser le clavier pour sélectionner des éléments de menu. Cette interface clavier n’a pas besoin de code spécial. Une application reçoit un message de commande indiquant si l’utilisateur sélectionne un élément de menu via le clavier ou à l’aide d’une souris. L’interface clavier standard traite les séquences de touches suivantes.
| Séquence de touches | Action |
|---|---|
| Caractère alphabétique | Sélectionne le premier élément de menu avec le caractère spécifié comme clé d’accès. Si l’élément sélectionné appelle un menu, le menu s’affiche et le premier élément est mis en surbrillance. Sinon, l’élément de menu est sélectionné. |
| ALT | Bascule en mode barre de menus et hors de la barre de menus. |
| Alt+Espace | Affiche le menu de la fenêtre. |
| ENTRÉE | Active un menu et sélectionne le premier élément de menu si un élément a un menu associé à celui-ci. Sinon, cette séquence de touches choisit l’élément comme si l’utilisateur a relâché le bouton de la souris pendant que l’élément a été sélectionné. |
| ESC | Quitte le mode de menu. |
| Gauche | Passe à l’élément de menu de niveau supérieur précédent. Les éléments de menu de niveau supérieur incluent les noms de menu et le menu de la fenêtre. Si l’élément sélectionné se trouve dans un menu, la colonne précédente du menu est sélectionnée ou l’élément de menu de niveau supérieur précédent est sélectionné. |
| Flèche droite | Fonctionne comme la touche FLÈCHE GAUCHE, sauf dans la direction opposée. Dans les menus, cette séquence de touches avance vers l’avant d’une colonne ; lorsque l’élément actuellement sélectionné se trouve dans la colonne d’extrême droite, le menu suivant est sélectionné. |
| Les flèches HAUT ou BAS | Active un menu lorsque vous appuyez sur un nom de menu. Lorsque vous appuyez sur un menu, la touche Flèche haut sélectionne l’élément précédent ; la frappe flèche bas sélectionne l’élément suivant. |
Touches d’accès au menu
L’interface clavier standard pour les menus peut être améliorée en ajoutant des touches d’accès (mnemonics) aux éléments de menu. Une clé d’accès est une lettre soulignée dans le texte d’un élément de menu. Lorsqu’un menu est actif, l’utilisateur peut sélectionner un élément de menu en appuyant sur la touche correspondant à la lettre soulignée de l’élément. L’utilisateur active la barre de menus en appuyant sur la touche Alt pour mettre en surbrillance le premier élément de la barre de menus. Un menu est actif lorsqu’il est affiché.
Pour créer une touche d’accès pour un élément de menu, précédez tout caractère dans la chaîne de texte de l’élément avec un ampersand. Par exemple, la chaîne de texte « &Move » amène le système à souligner la lettre « M ».
Touches de raccourci de menu
En plus d’avoir une touche d’accès, un élément de menu peut avoir une touche de raccourci associée. Une touche de raccourci est différente d’une touche d’accès, car le menu n’a pas besoin d’être actif pour que la touche de raccourci fonctionne. En outre, une touche d’accès est toujours associée à un élément de menu, tandis qu’une touche de raccourci est généralement (mais ne doit pas être) associée à un élément de menu.
Le texte qui identifie la touche de raccourci est ajouté à la chaîne de texte de l’élément de menu. Le texte du raccourci apparaît à droite du nom de l’élément de menu, après une barre oblique inverse et un caractère de tabulation (\t). Par exemple, « &Close\tAlt+F4 » représente une commande Close avec la combinaison de touches ALT+F4 comme touche de raccourci et avec la lettre « C » comme touche d’accès. Pour plus d'informations, consultez Accélérateurs de clavier.
Création de menu
Vous pouvez créer un menu à l’aide d’un modèle de menu ou de fonctions de création de menu. Les modèles de menu sont généralement définis en tant que ressources. Les ressources de modèle de menu peuvent être chargées explicitement ou affectées en tant que menu par défaut pour une classe de fenêtre. Vous pouvez également créer des ressources de modèle de menu dynamiquement en mémoire.
Les rubriques suivantes décrivent en détail la création de menus :
- Ressources de modèle de menu
- Modèle de menu en mémoire
- Poignées de menu
- Fonctions de création de menu
- Affichage du menu
- Menus de la classe Window
Ressources de modèle de menu
La plupart des applications créent des menus à l’aide de ressources de modèle de menu. Un modèle de menu définit un menu, y compris les éléments de la barre de menus et tous les menus. Pour plus d’informations sur la création d’une ressource de modèle de menu, consultez la documentation fournie avec vos outils de développement.
Après avoir créé une ressource de modèle de menu et l’ajouter au fichier exécutable de votre application (.exe), vous pouvez utiliser la fonction LoadMenu pour charger la ressource en mémoire. Cette fonction retourne un handle au menu, que vous pouvez ensuite affecter à une fenêtre à l’aide de la fonction SetMenu . Vous pouvez affecter un menu à n’importe quelle fenêtre qui n’est pas une fenêtre enfant.
L’implémentation de menus en tant que ressources facilite l’utilisation d’une application dans plusieurs pays/régions. Seul le fichier de définition de ressource doit être localisé pour chaque langue, et non pour le code source de l’application.
Modèle de menu en mémoire
Un menu peut être créé à partir d’un modèle de menu intégré à la mémoire au moment de l’exécution. Par exemple, une application qui permet à un utilisateur de personnaliser son menu peut créer un modèle de menu en mémoire en fonction des préférences de l’utilisateur. L’application peut ensuite enregistrer le modèle dans un fichier ou dans le Registre pour une utilisation ultérieure. Pour créer un menu à partir d’un modèle en mémoire, utilisez la fonction LoadMenuIndirect . Pour obtenir des descriptions des formats de modèle de menu, consultez Ressources du modèle de menu.
Un modèle de menu standard se compose d’une structure MENUITEMTEMPLATEHEADER suivie d’une ou plusieurs structures MENUITEMTEMPLATE .
Un modèle de menu étendu se compose d’une structure MENUEX_TEMPLATE_HEADER suivie d’une ou plusieurs structures MENUEX_TEMPLATE_ITEM .
Poignées de menu
Le système génère un handle unique pour chaque menu. Un handle de menu est une valeur du type HMENU . Une application doit spécifier un handle de menu dans la plupart des fonctions de menu. Vous recevez un handle pour une barre de menus lorsque vous créez le menu ou chargez une ressource de menu.
Pour récupérer un handle dans la barre de menus d’un menu qui a été créé ou chargé, utilisez la fonction GetMenu . Pour récupérer un handle vers le sous-menu associé à un élément de menu, utilisez la fonction GetSubMenu ou GetMenuItemInfo . Pour récupérer un handle dans un menu fenêtre, utilisez la fonction GetSystemMenu .
Fonctions de création de menu
À l’aide des fonctions de création de menus, vous pouvez créer des menus au moment de l’exécution ou ajouter des éléments de menu aux menus existants. Vous pouvez utiliser la fonction CreateMenu pour créer une barre de menus vide et la fonction CreatePopupMenu pour créer un menu vide. Vous pouvez enregistrer certaines informations de paramètres pour un menu à l’aide de la structure MENUINFO . Pour obtenir ou récupérer les paramètres d’un menu, utilisez GetMenuInfo ou SetMenuInfo. Pour ajouter des éléments à un menu, utilisez la fonction InsertMenuItem . Les fonctions AppendMenu et InsertMenu plus anciennes sont toujours prises en charge, mais InsertMenuItem doit être utilisée pour les nouvelles applications.
Affichage du menu
Une fois qu’un menu a été chargé ou créé, il doit être affecté à une fenêtre avant que le système puisse l’afficher. Vous pouvez attribuer un menu en définissant un menu de classe. Pour plus d’informations, consultez Menus de classe de fenêtre. Vous pouvez également affecter un menu à une fenêtre en spécifiant un handle au menu comme paramètre hMenu de la fonction CreateWindow ou CreateWindowEx , ou en appelant la fonction SetMenu .
Pour afficher un menu contextuel, utilisez la fonction TrackPopupMenuEx . Les menus contextuels, également appelés menus contextuels flottants ou menus contextuels, sont généralement affichés lorsque le message WM_CONTEXTMENU est traité.
Vous pouvez affecter un menu à n’importe quelle fenêtre qui n’est pas une fenêtre enfant.
L’ancienne fonction TrackPopupMenu est toujours prise en charge, mais les nouvelles applications doivent utiliser la fonction TrackPopupMenuEx .
Menus de la classe Window
Vous pouvez spécifier un menu par défaut, appelé menu de classe, lorsque vous inscrivez une classe de fenêtre. Pour ce faire, vous affectez le nom de la ressource de modèle de menu au membre lpszMenuName de la structure WNDCLASS utilisée pour inscrire la classe.
Par défaut, chaque fenêtre est affectée au menu de classe de sa classe de fenêtre. Vous n’avez donc pas besoin de charger explicitement le menu et de l’affecter à chaque fenêtre. Vous pouvez remplacer le menu de classe en spécifiant un handle de menu différent dans un appel à la fonction CreateWindowEx . Vous pouvez également modifier le menu d’une fenêtre après sa création à l’aide de la fonction SetMenu . Pour plus d’informations, consultez Classes de Fenêtre.
Éléments de menu
Les rubriques suivantes décrivent ce que fait le système lorsque l’utilisateur choisit un élément de menu et les façons dont une application peut contrôler l’apparence et la fonctionnalité d’un élément :
- Éléments de commande et éléments qui ouvrent les sous-menus
- identificateur deMenu-Item
- position deMenu-Item
- Accès aux éléments de menu par programmation
- Éléments de menu par défaut
- Éléments de menu sélectionnés et effacés
- Éléments de menu activés, grisés et désactivés
- Éléments de menu mis en surbrillance
- éléments de menuOwner-Drawn
- Séparateurs d’éléments de menu et sauts de ligne
Éléments de commande et éléments qui ouvrent les sous-menus
Lorsque l’utilisateur choisit un élément de commande, le système envoie un message de commande à la fenêtre propriétaire du menu. Si l’élément de commande se trouve dans le menu fenêtre, le système envoie le message WM_SYSCOMMAND . Sinon, il envoie le message WM_COMMAND .
À chaque élément de menu qui ouvre un sous-menu est associé un identificateur du sous-menu correspondant. Lorsque l’utilisateur pointe vers un tel élément, le système ouvre le sous-menu. Aucun message de commande n’est envoyé à la fenêtre propriétaire. Toutefois, le système envoie un message WM_INITMENUPOPUP à la fenêtre propriétaire avant d’afficher le sous-menu. Vous pouvez obtenir un handle pour le sous-menu associé à un élément à l’aide de la fonction GetSubMenu ou GetMenuItemInfo .
Une barre de menus contient généralement des noms de menus, mais elle peut également contenir des éléments de commande. Un sous-menu contient généralement des éléments de commande, mais il peut également contenir des éléments qui ouvrent des sous-menus imbriqués. En ajoutant ces éléments à des sous-menus, vous pouvez imbriquer des menus à n’importe quelle profondeur. Pour fournir un indicateur visuel à l’utilisateur, le système affiche automatiquement une petite flèche à droite du texte d’un élément de menu qui ouvre un sous-menu.
identificateur de Menu-Item
Associé à chaque élément de menu est un entier unique défini par l’application, appelé identificateur d’élément de menu. Lorsque l’utilisateur choisit un élément de commande dans un menu, le système envoie l’identificateur de l’élément à la fenêtre propriétaire dans le cadre d’un message WM_COMMAND . La procédure de fenêtre examine l’identificateur pour déterminer la source du message et traite le message en conséquence. En outre, vous pouvez spécifier un élément de menu à l’aide de son identificateur lorsque vous appelez des fonctions de menu ; par exemple, pour activer ou désactiver un élément de menu.
Les éléments de menu qui ouvrent les sous-menus ont des identificateurs comme les éléments de commande. Toutefois, le système n’envoie pas de message de commande lorsqu’un tel élément est sélectionné dans un menu. Au lieu de cela, le système ouvre le sous-menu associé à l’élément de menu.
Pour récupérer l’identificateur de l’élément de menu à une position spécifiée, utilisez la fonction GetMenuItemID ou GetMenuItemInfo .
position de Menu-Item
En plus d’avoir un identificateur unique, chaque élément de menu d’une barre de menus ou d’un menu a une valeur de position unique. L’élément le plus à gauche d’une barre de menus, ou l’élément supérieur d’un menu, a la position zéro. La valeur de position est incrémentée pour les éléments de menu suivants. Le système affecte une valeur de position à tous les éléments d’un menu, y compris les séparateurs. L’illustration suivante montre les valeurs de position des éléments dans une barre de menus et dans un menu.
Lorsque vous appelez une fonction de menu qui modifie ou récupère des informations sur un élément de menu spécifique, vous pouvez spécifier l’élément à l’aide de son identificateur ou de sa position. Pour plus d'informations, voir la section suivante.
Accès aux éléments de menu par programmation
La plupart des fonctions de menu vous permettent de spécifier un élément de menu par position ou par commande. Certaines fonctions utilisent les indicateurs MF_BYPOSITION et MF_BYCOMMAND pour indiquer l’algorithme de recherche ; d’autres ont un paramètre fByPosition explicite. Si vous spécifiez l’élément de menu par position, le numéro d’élément est un index de base zéro dans le menu. Si vous spécifiez l’élément de menu par commande, le menu et son sous-menu sont recherchés pour un élément dont l’identificateur de menu est égal au numéro d’élément fourni. Si plusieurs éléments de la hiérarchie de menus correspondent au numéro d’élément, il n'est pas précisé lequel est utilisé. Si vos menus contiennent des identificateurs de menu en double, vous devez utiliser des opérations de menu basées sur la position pour éviter cette ambiguïté.
Éléments de menu par défaut
Un sous-menu peut contenir un élément de menu par défaut. Lorsque l’utilisateur ouvre un sous-menu en double-cliquant, le système envoie un message de commande à la fenêtre propriétaire du menu et ferme le menu comme si l’élément de commande par défaut avait été choisi. S’il n’existe aucun élément de commande par défaut, le sous-menu reste ouvert. Pour récupérer et définir l’élément par défaut d’un sous-menu, utilisez les fonctions GetMenuDefaultItem et SetMenuDefaultItem .
Éléments de menu Sélectionnés et Effacer
Un élément de menu peut être sélectionné ou effacé. Le système affiche une bitmap en regard des éléments de menu sélectionnés pour indiquer leur état sélectionné. Le système n’affiche pas de bitmap en regard des éléments effacés, sauf si une bitmap définie par l’application est spécifiée. Seuls les éléments de menu d’un menu peuvent être sélectionnés ; les éléments d’une barre de menus ne peuvent pas être sélectionnés.
Les applications cochent ou effacent généralement un élément de menu pour indiquer si une option est en vigueur. Par exemple, supposons qu’une application dispose d’une barre d’outils que l’utilisateur peut afficher ou masquer à l’aide d’une commande de barre d’outils dans un menu. Lorsque la barre d’outils est masquée, l’élément de menu Barre d’outils est effacé. Lorsque l’utilisateur choisit la commande, l’application vérifie l’élément de menu et affiche la barre d’outils.
Un attribut de coche contrôle si un élément de menu est sélectionné. Vous pouvez définir l’attribut de coche d’un élément de menu à l’aide de la fonction CheckMenuItem . Vous pouvez utiliser la fonction GetMenuState pour déterminer si un élément de menu est actuellement sélectionné ou effacé.
Au lieu de CheckMenuItem et GetMenuState, vous pouvez utiliser les fonctions GetMenuItemInfo et SetMenuItemInfo pour récupérer et définir l’état de vérification d’un élément de menu.
Parfois, un groupe d’éléments de menu correspond à un ensemble d’options mutuellement exclusives. Dans ce cas, vous pouvez indiquer l’option sélectionnée à l’aide d’un élément de menu avec bouton radio sélectionné (analogue à un contrôle de bouton radio). Les éléments radio sélectionnés sont affichés avec une image de pastille au lieu d'une image de cocher. Pour vérifier un élément de menu et le rendre radio, utilisez la fonction CheckMenuRadioItem .
Par défaut, le système affiche une coche ou une image bitmap en regard des éléments de menu sélectionnés et aucune image bitmap en regard des éléments de menu effacés. Toutefois, vous pouvez utiliser la fonction SetMenuItemBitmaps pour associer des bitmaps sélectionnées et effacées définies par l’application à un élément de menu. Le système utilise ensuite les bitmaps spécifiées pour indiquer l’état sélectionné ou effacé de l’élément de menu.
Les bitmaps définies par l’application associées à un élément de menu doivent être de la même taille que la bitmap de coche par défaut, dont les dimensions peuvent varier en fonction de la résolution d’écran. Pour récupérer les dimensions correctes, utilisez la fonction GetSystemMetrics . Vous pouvez créer plusieurs ressources bitmap pour différentes résolutions d’écran ; créez une ressource bitmap et mettez-la à l’échelle, si nécessaire ; ou créez une bitmap au moment de l’exécution et dessinez une image dans celle-ci. Les bitmaps peuvent être monochromes ou de couleur. Toutefois, étant donné que les éléments de menu sont inversés lorsqu’ils sont mis en surbrillance, l’apparence de certaines bitmaps de couleurs inversées peut être indésirable. Pour plus d’informations, consultez Bitmaps.
Éléments de menu activés, grisés et désactivés
Un élément de menu peut être activé, grisé ou désactivé. Par défaut, un élément de menu est activé. Lorsque l’utilisateur choisit un élément de menu activé, le système envoie un message de commande à la fenêtre propriétaire ou affiche le sous-menu correspondant, selon le type d’élément de menu qu’il contient.
Lorsque les éléments de menu ne sont pas disponibles pour l’utilisateur, ils doivent être grisés ou désactivés. Les éléments de menu grisés et désactivés ne peuvent pas être choisis. Un élément désactivé ressemble à un élément activé. Lorsque l’utilisateur clique sur un élément désactivé, l’élément n’est pas sélectionné et rien ne se produit. Les éléments désactivés peuvent être utiles dans, par exemple, un didacticiel qui présente un menu qui semble actif, mais qui n’est pas.
Une application grise un élément de menu non disponible pour fournir un indicateur visuel à l’utilisateur qu’une commande n’est pas disponible. Vous pouvez utiliser un élément grisé lorsqu’une action n’est pas appropriée (par exemple, vous pouvez griser la commande Imprimer dans le menu Fichier lorsque le système n’a pas d’imprimante installée).
La fonction EnableMenuItem active, grise ou désactive un élément de menu. Pour déterminer si un élément de menu est activé, grisé ou désactivé, utilisez la fonction GetMenuItemInfo .
Au lieu de GetMenuItemInfo, vous pouvez également utiliser la fonction GetMenuState pour déterminer si un élément de menu est activé, grisé ou désactivé.
Éléments de menu mis en surbrillance
Le système met automatiquement en surbrillance les éléments de menu dans les menus lorsque l’utilisateur les sélectionne. Toutefois, la mise en surbrillance peut être explicitement ajoutée ou supprimée d’un nom de menu dans la barre de menus à l’aide de la fonction HiliteMenuItem . Cette fonction n’a aucun effet sur les éléments de menu des menus. Lorsque HiliteMenuItem est utilisé pour mettre en surbrillance un nom de menu, toutefois, le nom apparaît uniquement comme sélectionné. Si l’utilisateur appuie sur la touche Entrée, l’élément mis en surbrillance n’est pas choisi. Cette fonctionnalité peut être utile dans, par exemple, une application d’entraînement qui illustre l’utilisation des menus.
éléments de menu Owner-Drawn
Une application peut contrôler complètement l’apparence d’un élément de menu à l’aide d’un élément dessiné par le propriétaire. Les éléments dessinés par le propriétaire nécessitent qu’une application prenne la responsabilité totale du dessin sélectionné (mis en surbrillance), des états sélectionnés et effacés. Par exemple, si une application a fourni un menu de police, elle peut dessiner chaque élément de menu à l’aide de la police correspondante ; l’élément romain serait dessiné avec roman, l’élément pour Italique serait dessiné en italique, et ainsi de suite. Pour plus d’informations, consultez Création d’éléments de menu Owner-Drawn.
Séparateurs d’éléments de menu et sauts de ligne
Le système fournit un type spécial d’élément de menu, appelé séparateur, qui apparaît sous la forme d’une ligne horizontale. Vous pouvez utiliser un séparateur pour diviser un menu en groupes d’éléments associés. Un séparateur ne peut pas être utilisé dans une barre de menus et l’utilisateur ne peut pas sélectionner un séparateur.
Lorsqu’une barre de menus contient plus de noms de menus que d’une ligne, le système encapsule automatiquement la barre de menus en la cassant automatiquement en deux lignes ou plus. Vous pouvez provoquer un saut de ligne sur un élément spécifique dans une barre de menus en affectant l’indicateur de type MFT_MENUBREAK à l’élément. Le système place cet élément et tous les éléments suivants sur une nouvelle ligne.
Lorsqu’un menu contient plus d’éléments que ce qui s’adapte à une colonne, le menu est tronqué. Vous pouvez provoquer un saut de colonne sur un élément spécifique d’un menu en affectant l’indicateur de type MFT_MENUBREAK à l’élément ou en utilisant l’option MENUBREAK dans l’instruction MENUITEM . Le système place cet élément et tous les éléments suivants dans une nouvelle colonne. L’indicateur de type MFT_MENUBARBREAK a le même effet, sauf qu’une ligne verticale apparaît entre la nouvelle colonne et l’ancienne.
Si vous utilisez les fonctions AppendMenu, InsertMenu ou ModifyMenu pour affecter des sauts de ligne, vous devez affecter les indicateurs de type MF_MENUBREAK ou MF_MENUBARBREAK.
Messages utilisés avec les menus
Le système signale l’activité liée au menu en envoyant des messages à la procédure de fenêtre de la fenêtre propriétaire du menu. Le système envoie une série de messages lorsque l’utilisateur sélectionne des éléments dans la barre de menus ou clique sur le bouton droit de la souris pour afficher un menu contextuel.
Lorsque l’utilisateur active un élément dans la barre de menus, la fenêtre propriétaire reçoit d’abord un message WM_SYSCOMMAND . Ce message inclut un indicateur qui indique si l’utilisateur a activé le menu à l’aide du clavier (SC_KEYMENU) ou de la souris (SC_MOUSEMENU). Pour plus d’informations, consultez Accès au clavier aux menus.
Ensuite, avant d’afficher les menus, le système envoie le message WM_INITMENU à la procédure de fenêtre afin qu’une application puisse modifier les menus avant que l’utilisateur ne les voit. Le système envoie le message WM_INITMENU une seule fois par activation de menu.
Lorsque l’utilisateur pointe vers un élément de menu qui ouvre un sous-menu, le système envoie la fenêtre propriétaire au message WM_INITMENUPOPUP avant d’afficher le sous-menu. Ce message donne à l’application la possibilité de modifier le sous-menu avant son affichage.
Chaque fois que l’utilisateur déplace la mise en surbrillance d’un élément à un autre, le système envoie un message WM_MENUSELECT à la procédure de fenêtre de la fenêtre propriétaire du menu. Ce message identifie l’élément de menu actuellement sélectionné. De nombreuses applications fournissent une zone d’informations en bas de leurs fenêtres principales et utilisent ce message pour afficher des informations supplémentaires sur l’élément de menu sélectionné.
Lorsque l’utilisateur choisit un élément de commande dans un menu, le système envoie un message WM_COMMAND à la procédure de fenêtre. Le mot de bas ordre du paramètre wParam du message WM_COMMAND contient l’identificateur de l’élément choisi. La procédure de fenêtre doit examiner l’identificateur et traiter le message en conséquence.
Vous pouvez enregistrer des informations pour un menu à l’aide de la structure MENUINFO . Si le menu est défini avec un MENUINFO. valeur dwStyle de MNS_NOTIFYBYPOS, le système envoie WM_MENUCOMMAND au lieu du WM_COMMAND lorsqu’un élément est sélectionné. Cela vous permet d’accéder aux informations de la structure MENUINFO et fournit également l’index de l’élément sélectionné directement.
Tous les menus ne sont pas accessibles via la barre de menus d’une fenêtre. De nombreuses applications affichent des menus contextuels lorsque l’utilisateur clique sur le bouton droit de la souris à un emplacement spécifique. Ces applications doivent traiter le message WM_CONTEXTMENU et afficher un menu contextuel, le cas échéant. Si une application n’affiche pas de menu contextuel, elle doit transmettre le message WM_CONTEXTMENU à la fonction DefWindowProc pour le traitement par défaut.
Le message WM_MENURBUTTONUP est envoyé lorsque l’utilisateur relâche le bouton droit de la souris pendant que le curseur se trouve sur un élément de menu. Ce message est fourni afin que les applications puissent afficher un menu contextuel ou un menu raccourci pour un élément de menu.
Il existe quelques messages qui impliquent uniquement des menus glisser-déplacer. Le WM_MENUGETOBJECT est envoyé au propriétaire d’un menu glisser-déplacer lorsque le curseur de la souris entre un élément de menu ou passe du centre d’un élément au haut ou au bas d’un élément. Le message WM_MENUDRAG est envoyé lorsque l’utilisateur fait glisser un élément de menu.
Lorsqu’un menu déroulant ou un sous-menu a été détruit, le système envoie un message WM_UNINITMENUPOPUP .
Menu de destruction
Si un menu est affecté à une fenêtre et que cette fenêtre est détruite, le système détruit automatiquement le menu et son sous-menu, libérant la poignée du menu et la mémoire occupée par le menu. Le système ne détruit pas automatiquement un menu qui n’est pas affecté à une fenêtre. Une application doit détruire le menu non attribué en appelant la fonction DestroyMenu . Sinon, le menu continue d’exister en mémoire même après la fermeture de l’application. Pour mettre fin au menu actif du thread appelant, utilisez EndMenu. Si une plateforme ne prend pas en charge EndMenu, envoyez au propriétaire du menu actif un message WM_CANCELMODE .