À propos des menus
Un menu est une liste d’éléments qui spécifient des options ou des groupes d’options (un sous-menu) pour une application. Cliquer sur un élément de menu ouvre un sous-menu ou entraîne 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 clavier aux menus
- Création de menu
-
Éléments de menu
- Éléments de commande et éléments qui ouvrent des sous-menus
- Identificateur d’élément de menu
- Position de l’élément de menu
- Accès aux éléments de menu par programmation
- Éléments de menu par défaut
- Éléments de menu sélectionnés et effacer
- Éléments de menu activés, grisés et désactivés
- Éléments de menu mis en surbrillance
- Éléments de menu dessinés par le propriétaire
- Séparateurs d’éléments de menu et sauts de ligne
- Messages utilisés avec les menus
- Menu Destruction
Barres de menus et menus
Un menu est organisé dans une hiérarchie. Au niveau supérieur de la hiérarchie se trouve la barre de menus ; qui contient une liste de menus, qui à leur tour peuvent 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 exécuter une commande ou ouvrir un sous-menu. Un élément qui exécute une commande est appelé élément de commande ou 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. Un menu ouvert à partir de la barre de menus descend de la barre de menus 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 de la barre de menus qui ouvre un menu déroulant est également appelé nom de menu.
Les noms de menu d’une barre de menus représentent les main 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 l’utilisateur clique, 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 un. 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 qui se chevauchent et les fenêtres contextuelles, 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 présente 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ù sur 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 s’affiche généralement à la position du curseur du caret ou de la souris.
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 pour modifier la taille ou la position d’une fenêtre, ou fermer l’application. Les éléments du menu de la 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 enfant qui se chevauche peut avoir un menu de fenêtre. Il est rare qu’une fenêtre contextuelle ou superposée n’inclue pas de menu de 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 de la fenêtre. Au lieu de cela, il transmet simplement les messages à la fonction DefWindowProc pour le traitement par défaut système du message. Si une application ajoute une commande au menu de la 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 la fenêtre par défaut à modifier. Toute fenêtre qui n’utilise pas la fonction GetSystemMenu pour créer sa propre copie du menu de la fenêtre reçoit le menu de la 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 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 mnémoniques 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 dispositif de pointage. É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, que 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 choisi. |
Alt | Active et sort du mode barre de menus. |
ALT + BARRE D’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 est associé à un menu. 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é. |
ÉCHAP | Quitte le mode de menu. |
Gauche | Effectue un cycle vers 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 flèche gauche, sauf dans la direction opposée. Dans les menus, cette séquence de touches avance d’une colonne ; lorsque l’élément actuellement sélectionné se trouve dans la colonne à l’extrême droite, le menu suivant est sélectionné. |
Flèches vers le haut ou vers le bas | Active un menu lorsque vous appuyez sur un nom de menu. Lorsque vous appuyez sur un menu, la combinaison de touches flèche vers le haut sélectionne l’élément précédent ; La combinaison de touches flèche bas sélectionne l’élément suivant. |
Touches d’accès de menu
L’interface clavier standard des menus peut être améliorée en ajoutant des touches d’accès (mnémoniques) 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 s’affiche.
Pour créer une touche d’accès pour un élément de menu, précédez un caractère de la chaîne de texte de l’élément d’une esperluette. Par exemple, la chaîne de texte «& Move » fait que le système souligne la lettre « M ».
Touches de raccourci de menu
En plus d’avoir une touche d’accès, une touche de raccourci peut être associée à un élément de menu. 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 l’être) associée à un élément de menu.
Le texte qui identifie la touche de raccourci est ajouté à la chaîne de texte d’é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 Fermer 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 Raccourcis 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 la création de menu en détail :
- 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 classe de fenêtre
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 incluse avec vos outils de développement.
Après avoir créé une ressource de modèle de menu et l’avoir ajoutée au fichier exécutable (.exe) de votre application, vous pouvez utiliser la fonction LoadMenu pour charger la ressource en mémoire. Cette fonction retourne un handle dans le 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 la localisation d’une application pour une utilisation 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é en 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 une description des formats de modèle de menu, consultez Ressources de 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 de 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 dans le sous-menu associé à un élément de menu, utilisez la fonction GetSubMenu ou GetMenuItemInfo . Pour récupérer un handle dans un menu de fenêtre, utilisez la fonction GetSystemMenu .
Fonctions de création de menu
À l’aide des fonctions de création de menu, vous pouvez créer des menus au moment de l’exécution ou ajouter des éléments de menu à des 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 anciennes fonctions AppendMenu et InsertMenu sont toujours prises en charge, mais InsertMenuItem doit être utilisé pour les nouvelles applications.
Affichage du menu
Une fois qu’un menu a été chargé ou créé, il doit être affecté à une fenêtre pour que le système puisse l’afficher. Vous pouvez affecter 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 dans le 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, s’affichent généralement 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 classe de fenêtre
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 attribuez 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 se voit attribuer le menu de classe pour 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 autre handle de menu 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êtres.
É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 les fonctionnalités d’un élément :
- Éléments de commande et éléments qui ouvrent des sous-menus
- Identificateur d’élément de menu
- Position de l’élément de menu
- Accès aux éléments de menu par programmation
- Éléments de menu par défaut
- Éléments de menu sélectionnés et effacer
- Éléments de menu activés, grisés et désactivés
- Éléments de menu mis en surbrillance
- Éléments de menu dessinés par le propriétaire
- Séparateurs d’éléments de menu et sauts de ligne
Éléments de commande et éléments qui ouvrent des sous-menus
Lorsque l’utilisateur choisit un élément de commande, le système envoie un message de commande à la fenêtre qui possède le menu. Si l’élément de commande se trouve dans le menu de la fenêtre, le système envoie le message WM_SYSCOMMAND . Sinon, il envoie le message WM_COMMAND .
Associé à chaque élément de menu qui ouvre un sous-menu est un handle 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 menu, 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 aux sous-menus, vous pouvez imbriquer des menus à n’importe quelle profondeur. Pour fournir un repère 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
Chaque élément de menu est associé à 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 WM_COMMAND message. 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 des sous-menus ont des identificateurs comme le font 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 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, consultez 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 ses sous-menus 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 spécifié 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 de effacer les éléments, sauf si une bitmap « claire » 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 case activée généralement ou effacer 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 Barre d’outils dans un menu. Lorsque la barre d’outils est masquée, l’élément de menu Barre d’outils est clair. Lorsque l’utilisateur choisit la commande, l’application vérifie l’élément de menu et affiche la barre d’outils.
Un attribut de marque case activée contrôle si un élément de menu est sélectionné. Vous pouvez définir l’attribut de marque case activée 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 case activée 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 radio sélectionné (analogue à un contrôle d’option). Les éléments radio sélectionnés s’affichent avec une image bitmap de puces au lieu d’une bitmap de marque case activée. Pour case activée un élément de menu et en faire un élément radio, utilisez la fonction CheckMenuRadioItem.
Par défaut, le système affiche une marque case activée ou une image bitmap de puces en regard des éléments de menu sélectionnés et aucune 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 avoir la même taille que la bitmap case activée marque par défaut, dont les dimensions peuvent varier en fonction de la résolution de l’é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-y une image. Les bitmaps peuvent être monochromes ou en 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 couleur 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 s’agit.
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, par exemple, dans un tutoriel qui présente un menu qui semble actif, mais qui ne l’est pas.
Une application grise un élément de menu non disponible pour indiquer à 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 l’imprimante n’est pas installée sur le système).
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 des menus à mesure que 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. Toutefois, lorsque HiliteMenuItem est utilisé pour mettre en surbrillance un nom de menu, le nom apparaît uniquement comme sélectionné. Si l’utilisateur appuie sur la touche ENTRÉE, l’élément en surbrillance n’est pas choisi. Cette fonctionnalité peut être utile, par exemple, dans une application de formation qui illustre l’utilisation des menus.
Owner-Drawn Éléments de menu
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 assume la responsabilité totale du dessin des états sélectionnés (mis en surbrillance), sélectionnés et effacés. Par exemple, si une application fournit un menu de police, elle peut dessiner chaque élément de menu à l’aide de la police correspondante ; l’élément pour Roman 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 forme de 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 qu’il n’y en a sur une ligne, le système encapsule automatiquement la barre en deux lignes ou plus. Vous pouvez provoquer un saut de ligne au niveau d’un élément spécifique d’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 qu’une colonne, le menu est tronqué. Vous pouvez provoquer un saut de colonne au niveau d’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 clavier aux menus.
Ensuite, avant d’afficher des 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 n’envoie le message WM_INITMENU qu’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 le message WM_INITMENUPOPUP avant d’afficher le sous-menu. Ce message donne à l’application la possibilité de modifier le sous-menu avant qu’il ne s’affiche.
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 main 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 de la WM_COMMAND lorsqu’un élément est sélectionné. Cela vous permet d’accéder aux informations dans 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 passer 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 alors 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 contextuel 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 dans un élément de menu ou se déplace du centre d’un élément vers le haut ou le bas d’un élément. Le message WM_MENUDRAG est envoyé lorsque l’utilisateur fait effectivement 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 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 ainsi 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 .