Informationen zu Menüs
Ein Menü ist eine Liste von Elementen, die Optionen oder Gruppen von Optionen (ein Untermenü) für eine Anwendung angeben. Wenn Sie auf ein Menüelement klicken, wird ein Untermenü geöffnet, oder die Anwendung führt einen Befehl aus. Dieser Abschnitt enthält Informationen zu den folgenden Themen:
- Menüleisten und Menüs
- Tastaturzugriff auf Menüs
- Menüerstellung
- Menüelemente
- Befehlselemente und Elemente, die Untermenüs öffnen
- Menüelementbezeichner
- Menüelementposition
- Programmgesteuerter Zugriff auf Menüelemente
- Standardmenüelemente
- Ausgewählte und löschene Menüelemente
- Aktivierte, graue und deaktivierte Menüelemente
- Hervorgehobene Menüelemente
- Vom Besitzer gezeichnete Menüelemente
- Menüelementtrennzeichen und Zeilenumbrüche
- Mit Menüs verwendete Meldungen
- Menüvernichtung
Menüleisten und Menüs
Ein Menü wird in einer Hierarchie angeordnet. Auf der obersten Ebene der Hierarchie befindet sich die Menüleiste. , die eine Liste von Menüs enthält, die wiederum Untermenüs enthalten können. Eine Menüleiste wird manchmal als Menü der obersten Ebene bezeichnet, und die Menüs und Untermenüs werden auch als Popupmenüs bezeichnet.
Ein Menüelement kann entweder einen Befehl ausführen oder ein Untermenü öffnen. Ein Element, das einen Befehl aus führt, wird als Befehlselement oder Befehl bezeichnet.
Ein Element in der Menüleiste öffnet fast immer ein Menü. Menüleisten enthalten selten Befehlselemente. Ein Menü, das über die Menüleiste geöffnet wird, wird in der Menüleiste nach unten angezeigt und manchmal als Dropdownmenü bezeichnet. Wenn ein Dropdownmenü angezeigt wird, wird es an die Menüleiste angefügt. Ein Menüelement auf der Menüleiste, das ein Dropdownmenü öffnet, wird auch als Menüname bezeichnet.
Die Menünamen auf einer Menüleiste stellen die Hauptkategorien von Befehlen dar, die eine Anwendung bietet. Wenn Sie in der Menüleiste einen Menünamen auswählen, wird in der Regel ein Menü geöffnet, dessen Menüelemente den Befehlen in einer Kategorie entsprechen. Beispielsweise kann eine Menüleiste einen Dateimenünamen enthalten, der beim Klicken durch den Benutzer ein Menü mit Menüelementen wie Neu, Öffnen und Speichern aktiviert. Um Informationen zu einer Menüleiste zu erhalten, rufen Sie GetMenuBarInfo auf.
Nur ein überlappendes oder Popupfenster kann eine Menüleiste enthalten. Ein untergeordnetes Fenster darf keins enthalten. Wenn das Fenster über eine Titelleiste verfügt, positioniert das System die Menüleiste direkt darunter. Eine Menüleiste ist immer sichtbar. Ein Untermenü ist jedoch erst sichtbar, wenn der Benutzer ein Menüelement auswählt, das es aktiviert. Weitere Informationen zu überlappenden und Popupfenstern finden Sie unter Fenstertypen.
Jedes Menü muss über ein Besitzerfenster verfügen. Das System sendet Nachrichten an das Besitzerfenster eines Menüs, wenn der Benutzer das Menü auswählt oder ein Element aus dem Menü auswählt.
In diesem Abschnitt werden die folgenden Themen erläutert.
Kontextmenüs
Das System stellt auch Kontextmenüs zur Auswahl. Ein Kontextmenü ist nicht an die Menüleiste angefügt. sie kann an einer beliebigen Stelle auf dem Bildschirm angezeigt werden. Eine Anwendung ordnet ein Kontextmenü in der Regel einem Bereich eines Fensters zu, z. B. dem Clientbereich, oder einem bestimmten Objekt, z. B. einem Symbol. Aus diesem Grund werden diese Menüs auch als Kontextmenüs bezeichnet.
Ein Kontextmenü bleibt ausgeblendet, bis der Benutzer es aktiviert, in der Regel durch Klicken mit der rechten Maustaste auf eine Auswahl, eine Symbolleiste oder eine Taskleistenschaltfläche. Das Menü wird in der Regel an der Position des Caretcursors oder Mauszeigers angezeigt.
Das Fenstermenü
Das Menü Fenster (auch als System- oder Steuerungsmenü bezeichnet) ist ein Popupmenü, das fast ausschließlich vom Betriebssystem definiert und verwaltet wird. Der Benutzer kann das Fenstermenü öffnen, indem er auf der Titelleiste auf das Anwendungssymbol klickt oder mit der rechten Maustaste auf eine beliebige Stelle in der Titelleiste klickt.
Das Menü Fenster bietet einen Standardsatz von Menüelementen, die der Benutzer auswählen kann, um die Größe oder Position eines Fensters zu ändern oder die Anwendung zu schließen. Elemente im Fenstermenü können hinzugefügt, gelöscht und geändert werden, aber die meisten Anwendungen verwenden nur den Standardsatz von Menüelementen. Ein überlappendes, Popup- oder untergeordnetes Fenster kann über ein Fenstermenü verfügen. Es ist ungewöhnlich, dass ein überlappendes oder Popupfenster kein Fenstermenü enthält.
Wenn der Benutzer im Menü Fenster einen Befehl auswählt, sendet das System eine _ WM-SYSCOMMAND-Meldung an das Besitzerfenster des Menüs. In den meisten Anwendungen verarbeitet die Fensterprozedur keine Nachrichten aus dem Fenstermenü. Stattdessen werden die Nachrichten zur systemstandardbasierten Verarbeitung der Nachricht einfach an die DefWindowProc-Funktion übergeben. Wenn eine Anwendung dem Fenstermenü einen Befehl hinzufügt, muss die Fensterprozedur den Befehl verarbeiten.
Eine Anwendung kann die GetSystemMenu-Funktion verwenden, um eine Kopie des Standardfenstermenüs zu erstellen, das geändert werden soll. Jedes Fenster, das die GetSystemMenu-Funktion nicht verwendet, um eine eigene Kopie des Fenstermenüs zu erstellen, erhält das Standardfenstermenü.
Hilfebezeichner
Jedem Menüleisten-, Menü-, Untermenü- und Kontextmenü ist ein Hilfebezeichner zugeordnet. Wenn der Benutzer die TASTE F1 drückt, während das Menü aktiv ist, wird dieser Wert als Teil einer _ WM-HILFE-Nachricht an das Besitzerfenster gesendet.
Tastaturzugriff auf Menüs
Das System stellt eine Standardtastaturschnittstelle für Menüs bereit. Sie können diese Schnittstelle verbessern, indem Sie mnemonische Zugriffsschlüssel und Tastenkombinationen (Zugriffstasten) für Ihre Menüelemente bereitstellen.
In den folgenden Themen werden die Standardtastaturschnittstelle, Zugriffsschlüssel und Tastenkombinationen beschrieben:
Standardtastaturschnittstelle
Das System ist für die Arbeit mit oder ohne Maus oder ein anderes zeigendes Gerät konzipiert. Da das System eine Standardtastaturschnittstelle bereitstellt, kann der Benutzer die Tastatur verwenden, um Menüelemente auszuwählen. Diese Tastaturschnittstelle benötigt keinen speziellen Code. Eine Anwendung empfängt eine Befehlsmeldung, unabhängig davon, ob der Benutzer ein Menüelement über die Tastatur oder mit der Maus auswählt. Die Standardtastaturschnittstelle verarbeitet die folgenden Tastatureingaben.
| Tastatureingabe | Aktion |
|---|---|
| Alphabetisches Zeichen | Wählt das erste Menüelement mit dem angegebenen Zeichen als Zugriffsschlüssel aus. Wenn das ausgewählte Element ein Menü aufruft, wird das Menü angezeigt, und das erste Element wird hervorgehoben. Andernfalls wird das Menüelement ausgewählt. |
| ALT | Schaltet den Menüleistenmodus ein und aus. |
| ALT+LEERTASTE | Zeigt das Fenstermenü an. |
| EINGABETASTE | Aktiviert ein Menü und wählt das erste Menüelement aus, wenn einem Element ein Menü zugeordnet ist. Andernfalls wählt diese Tastatureingabe das Element so aus, als ob der Benutzer die Maustaste losgelassen hätte, während das Element ausgewählt wurde. |
| ESC | Beendet den Menümodus. |
| NACH-LINKS-TASTE | Zyklen zum vorherigen Menüelement der obersten Ebene. Menüelemente der obersten Ebene enthalten Menünamen und das Fenstermenü. Wenn sich das ausgewählte Element in einem Menü befindet, wird die vorherige Spalte im Menü oder das vorherige Menüelement der obersten Ebene ausgewählt. |
| NACH-RECHTS-TASTE | Funktioniert wie die NACH-LINKS-TASTE, außer in entgegengesetzter Richtung. In Menüs wird diese Tastatureingabe um eine Spalte nach vorn verschoben. Wenn sich das aktuell ausgewählte Element in der Spalte ganz rechts befindet, wird das nächste Menü ausgewählt. |
| NACH-OBEN- oder NACH-UNTEN-TASTE | Aktiviert ein Menü, wenn ein Menüname gedrückt wird. Wenn sie in einem Menü gedrückt wird, wählt die NACH-OBEN-TASTE das vorherige Element aus. Mit der TASTENKOMBINATION NACH-UNTEN wird das nächste Element ausgewählt. |
Menüzugriffsschlüssel
Die Standardtastaturschnittstelle für Menüs kann verbessert werden, indem Menüelementen Zugriffsschlüssel (mnemonics) hinzugefügt werden. Ein Zugriffsschlüssel ist ein unterstrichener Buchstabe im Text eines Menüelements. Wenn ein Menü aktiv ist, kann der Benutzer ein Menüelement auswählen, indem er die Taste drückt, die dem unterstrichenen Buchstaben des Elements entspricht. Der Benutzer aktiviert die Menüleiste, indem er die ALT-TASTE drückt, um das erste Element auf der Menüleiste hervorzuheben. Ein Menü ist aktiv, wenn es angezeigt wird.
Um einen Zugriffsschlüssel für ein Menüelement zu erstellen, müssen Sie jedem Zeichen in der Textzeichenfolge des Elements ein ampersand voranstellen. Die Textzeichenfolge "&Move" bewirkt beispielsweise, dass das System den Buchstaben "M" unterstreicht.
Tastenkombinationen im Menü
Zusätzlich zu einer Zugriffsschlüssel kann einem Menüelement eine Tastenkombination zugeordnet sein. Eine Tastenkombination unterscheidet sich von einer Zugriffstaste, da das Menü nicht aktiv sein muss, damit die Tastenkombination funktioniert. Außerdem ist eine Zugriffsschlüssel immer einem Menüelement zugeordnet, während eine Tastenkombination in der Regel einem Menüelement zugeordnet ist (muss aber nicht sein).
Text, der die Tastenkombination identifiziert, wird der Textzeichenfolge des Menüelements hinzugefügt. Der Kontexttext wird rechts neben dem Namen des Menüelements nach einem umgekehrten Schrägstrich und tabellarischen Zeichen ( \ t) angezeigt. Beispielsweise stellt "&Close \ tAlt+F4" einen Close-Befehl mit der Tastenkombination ALT+F4 als Tastenkombination und dem Buchstaben "C" als Zugriffsschlüssel dar. Weitere Informationen finden Sie unter Tastaturbeschleunigungen.
Menüerstellung
Sie können ein Menü entweder mithilfe einer Menüvorlage oder mit Menüerstellungsfunktionen erstellen. Menüvorlagen werden in der Regel als Ressourcen definiert. Menüvorlagenressourcen können explizit geladen oder als Standardmenü für eine Fensterklasse zugewiesen werden. Sie können Menüvorlagenressourcen auch dynamisch im Arbeitsspeicher erstellen.
In den folgenden Themen wird die Menüerstellung ausführlich beschrieben:
- Menüvorlagenressourcen
- Menüvorlage im Arbeitsspeicher
- Menühandles
- Funktionen zur Menüerstellung
- Menüanzeige
- Fensterklassenmenüs
Menüvorlagenressourcen
Die meisten Anwendungen erstellen Menüs mithilfe von Menüvorlagenressourcen. Eine Menüvorlage definiert ein Menü, einschließlich der Elemente in der Menüleiste und aller Menüs. Informationen zum Erstellen einer Menüvorlagenressource finden Sie in der Dokumentation zu Ihren Entwicklungstools.
Nachdem Sie eine Menüvorlagenressource erstellt und der ausführbaren Datei (.exe) Ihrer Anwendung hinzugefügt haben, können Sie die LoadMenu-Funktion verwenden, um die Ressource in den Arbeitsspeicher zu laden. Diese Funktion gibt ein Handle für das Menü zurück, das Sie dann mithilfe der SetMenu-Funktion einem Fenster zuweisen können. Sie können jedem Fenster, das kein untergeordnetes Fenster ist, ein Menü zuweisen.
Die Implementierung von Menüs als Ressourcen erleichtert die Lokalisierung einer Anwendung für die Verwendung in mehreren Ländern/Regionen. Nur die Ressourcendefinitionsdatei muss für jede Sprache lokalisiert werden, nicht für den Quellcode der Anwendung.
Menüvorlage im Arbeitsspeicher
Ein Menü kann aus einer Menüvorlage erstellt werden, die zur Laufzeit im Arbeitsspeicher erstellt wird. Beispielsweise kann eine Anwendung, die es einem Benutzer ermöglicht, sein Menü anzupassen, basierend auf den Einstellungen des Benutzers eine Menüvorlage im Arbeitsspeicher erstellen. Die Anwendung könnte die Vorlage dann zur späteren Verwendung in einer Datei oder in der Registrierung speichern. Verwenden Sie die LoadMenuIndirect-Funktion, um ein Menü aus einer Vorlage im Arbeitsspeicher zu erstellen. Beschreibungen der Menüvorlagenformate finden Sie unter Menüvorlagenressourcen.
Eine Standardmenüvorlage besteht aus einer MENUITEMTEMPLATEHEADER-Struktur, gefolgt von einer oder mehreren MENUITEMTEMPLATE-Strukturen.
Eine erweiterte Menüvorlage besteht aus einer MENUEX _ TEMPLATE _ HEADER-Struktur gefolgt von einer oder mehreren MENUEX _ TEMPLATE _ ITEM-Strukturen.
Menühandles
Das System generiert ein eindeutiges Handle für jedes Menü. Ein Menühandle ist ein Wert des HMENU-Typs. Eine Anwendung muss in vielen Menüfunktionen ein Menühandle angeben. Sie erhalten ein Handle für eine Menüleiste, wenn Sie das Menü erstellen oder eine Menüressource laden.
Verwenden Sie die GetMenu-Funktion, um ein Handle für die Menüleiste für ein Menü abzurufen, das erstellt oder geladen wurde. Verwenden Sie die Funktion GetSubMenu oder GetMenuItemInfo, um ein Handle für das Einem Menüelement zugeordnete Untermenü abzurufen. Verwenden Sie die GetSystemMenu-Funktion, um ein Handle für ein Fenstermenü abzurufen.
Menüerstellungsfunktionen
Mithilfe von Menüerstellungsfunktionen können Sie Menüs zur Laufzeit erstellen oder vorhandenen Menüs Menüelemente hinzufügen. Sie können die Funktion CreateMenu verwenden, um eine leere Menüleiste zu erstellen, und die CreatePopupMenu-Funktion, um ein leeres Menü zu erstellen. Sie können bestimmte Einstellungsinformationen für ein Menü speichern, indem Sie die MENUINFO-Struktur verwenden. Verwenden Sie GetMenuInfo oder SetMenuInfo,um die Einstellungen eines Menüs abzurufen oder abzurufen. Verwenden Sie die InsertMenuItem-Funktion, um einem Menü Elemente hinzuzufügen. Die älteren AppendMenu- und InsertMenu-Funktionen werden weiterhin unterstützt, insertMenuItem sollte jedoch für neue Anwendungen verwendet werden.
Menüanzeige
Nachdem ein Menü geladen oder erstellt wurde, muss es einem Fenster zugewiesen werden, bevor es vom System angezeigt werden kann. Sie können ein Menü zuweisen, indem Sie ein Klassenmenü definieren. Weitere Informationen finden Sie unter Window Class Menus. Sie können einem Fenster auch ein Menü zuweisen, indem Sie ein Handle für das Menü als hMenu-Parameter der CreateWindow- oder CreateWindowEx-Funktion angeben oder indem Sie die SetMenu-Funktion aufrufen.
Verwenden Sie zum Anzeigen eines Kontextmenüs die TrackPopupMenuEx-Funktion. Kontextmenüs, auch als unverankerte Popupmenüs oder Kontextmenüs bezeichnet, werden in der Regel angezeigt, wenn die WM _ CONTEXTMENU-Nachricht verarbeitet wird.
Sie können jedem Fenster, das kein untergeordnetes Fenster ist, ein Menü zuweisen.
Die ältere TrackPopupMenu-Funktion wird weiterhin unterstützt, aber neue Anwendungen sollten die TrackPopupMenuEx-Funktion verwenden.
Window-Klassenmenüs
Sie können ein Standardmenü angeben, das als Klassenmenü bezeichnet wird, wenn Sie eine Fensterklasse registrieren. Dazu weisen Sie den Namen der Menüvorlagenressource dem lpszMenuName-Member der WNDCLASS-Struktur zu, die zum Registrieren der Klasse verwendet wird.
Standardmäßig wird jedem Fenster das Klassenmenü für seine Fensterklasse zugewiesen, sodass Sie das Menü nicht explizit laden und jedem Fenster zuweisen müssen. Sie können das Klassenmenü überschreiben, indem Sie in einem Aufruf der CreateWindowEx-Funktion ein anderes Menühandpunkt angeben. Sie können auch das Menü eines Fensters ändern, nachdem es erstellt wurde, indem Sie die SetMenu-Funktion verwenden. Weitere Informationen finden Sie unter Fensterklassen.
Menüelemente
In den folgenden Themen wird die Funktionsweise des Systems behandelt, wenn der Benutzer ein Menüelement auswählt, und wie eine Anwendung die Darstellung und Funktionalität eines Elements steuern kann:
- Befehlselemente und Elemente, die Untermenüs öffnen
- Menüelementbezeichner
- Menüelementposition
- Programmgesteuerter Zugriff auf Menüelemente
- Standardmenüelemente
- Ausgewählte und löschene Menüelemente
- Aktivierte, graue und deaktivierte Menüelemente
- Hervorgehobene Menüelemente
- Vom Besitzer gezeichnete Menüelemente
- Menüelementtrennzeichen und Zeilenumbrüche
Befehlselemente und Elemente, die Untermenüs öffnen
Wenn der Benutzer ein Befehlselement auswählt, sendet das System eine Befehlsmeldung an das Fenster, das das Menü besitzt. Wenn sich das Befehlselement im Fenstermenü befindet, sendet das System die WM _ SYSCOMMAND-Nachricht. Andernfalls wird die WM _ COMMAND-Nachricht gesendet.
Jedem Menüelement zugeordnet, das ein Untermenü öffnet, ist ein Handle für das entsprechende Untermenü. Wenn der Benutzer auf ein solches Element zeigt, öffnet das System das Untermenü. Es wird keine Befehlsmeldung an das Besitzerfenster gesendet. Das System sendet jedoch eine WM _ INITMENUPOPUP-Meldung an das Besitzerfenster, bevor das Untermenü angezeigt wird. Sie können ein Handle für das Einem Element zugeordnete Untermenü mithilfe der GetSubMenu- oder GetMenuItemInfo-Funktion erhalten.
Eine Menüleiste enthält in der Regel Menünamen, kann aber auch Befehlselemente enthalten. Ein Untermenü enthält in der Regel Befehlselemente, kann aber auch Elemente enthalten, die geschachtelte Untermenüs öffnen. Durch Hinzufügen solcher Elemente zu Untermenüs können Sie Menüs in beliebiger Tiefe schachteln. Um dem Benutzer einen visuellen Hinweis zu geben, zeigt das System automatisch einen kleinen Pfeil rechts neben dem Text eines Menüelements an, das ein Untermenü öffnet.
Menu-Item Bezeichner
Jedem Menüelement ist eine eindeutige, anwendungsdefinierte ganze Zahl zugeordnet, die als Menüelementbezeichner bezeichnet wird. Wenn der Benutzer ein Befehlselement aus einem Menü auswählt, sendet das System den Elementbezeichner als Teil einer WM _ COMMAND-Meldung an das Besitzerfenster. Die Fensterprozedur untersucht den Bezeichner, um die Quelle der Nachricht zu bestimmen, und verarbeitet die Nachricht entsprechend. Darüber hinaus können Sie ein Menüelement mit seinem Bezeichner angeben, wenn Sie Menüfunktionen aufrufen. Beispielsweise zum Aktivieren oder Deaktivieren eines Menüelements.
Menüelemente, die Untermenüs öffnen, verfügen genau wie Befehlselemente über Bezeichner. Das System sendet jedoch keine Befehlsnachricht, wenn ein solches Element aus einem Menü ausgewählt wird. Stattdessen öffnet das System das Untermenü, das dem Menüelement zugeordnet ist.
Um den Bezeichner des Menüelements an einer angegebenen Position abzurufen, verwenden Sie die GetMenuItemID- oder GetMenuItemInfo-Funktion.
Menu-Item Position
Zusätzlich zu einem eindeutigen Bezeichner verfügt jedes Menüelement in einer Menüleiste oder einem Menü über einen eindeutigen Positionswert. Das element ganz links in einer Menüleiste oder das oberste Element in einem Menü hat position 0 (null). Der Positionswert wird für nachfolgende Menüelemente inkrementiert. Das System weist allen Elementen in einem Menü einen Positionswert zu, einschließlich Trennzeichen. Die folgende Abbildung zeigt die Positionswerte von Elementen in einer Menüleiste und in einem Menü.

Wenn Sie eine Menüfunktion aufrufen, die Informationen zu einem bestimmten Menüelement ändert oder abruft, können Sie das Element entweder mit seinem Bezeichner oder seiner Position angeben. Weitere Informationen finden Sie im nächsten Abschnitt.
Programmgesteuerter Zugriff auf Menüelemente
Mit den meisten Menüfunktionen können Sie ein Menüelement entweder nach Position oder nach Befehl angeben. Einige Funktionen verwenden die MF _ BYPOSITION- und MF _ BYCOMMAND-Flags, um den Suchalgorithmus anzugeben. Andere verfügen über einen expliziten fByPosition-Parameter. Wenn Sie das Menüelement nach Position angeben, ist die Elementnummer ein nullbasierter Index im Menü. Wenn Sie das Menüelement über einen Befehl angeben, werden das Menü und seine Untermenüs nach einem Element durchsucht, dessen Menübezeichner der angegebenen Elementnummer entspricht. Wenn mehr als ein Element in der Menühierarchie der Elementnummer entspricht, wird nicht angegeben, welches Element verwendet wird. Wenn Ihre Menüs doppelte Menübezeichner enthalten, sollten Sie positionsbasierte Menüvorgänge verwenden, um diese Mehrdeutigkeit zu vermeiden.
Standardmenüelemente
Ein Untermenü kann ein Standardmenüelement enthalten. Wenn der Benutzer durch Doppelklicken ein Untermenü öffnet, sendet das System eine Befehlsmeldung an das Besitzerfenster des Menüs und schließt das Menü so, als wäre das Standardbefehlselement ausgewählt worden. Wenn es kein Standardbefehlselement gibt, bleibt das Untermenü geöffnet. Verwenden Sie zum Abrufen und Festlegen des Standardelements für ein Untermenü die Funktionen GetMenuDefaultItem und SetMenuDefaultItem.
Ausgewählte und löschene Menüelemente
Ein Menüelement kann entweder ausgewählt oder löschen werden. Das System zeigt eine Bitmap neben ausgewählten Menüelementen an, um den ausgewählten Zustand anzugeben. Das System zeigt keine Bitmap neben löschenden Elementen an, es sei denn, eine anwendungsdefinierte "clear"-Bitmap ist angegeben. Es können nur Menüelemente in einem Menü ausgewählt werden. Elemente in einer Menüleiste können nicht ausgewählt werden.
Anwendungen überprüfen oder löschen in der Regel ein Menüelement, um anzugeben, ob eine Option wirksam ist. Angenommen, eine Anwendung verfügt über eine Symbolleiste, die der Benutzer mithilfe eines Symbolleistenbefehls in einem Menü anzeigen oder ausblenden kann. Wenn die Symbolleiste ausgeblendet ist, ist das Menüelement Symbolleiste klar. Wenn der Benutzer den Befehl auswählt, überprüft die Anwendung das Menüelement und zeigt die Symbolleiste an.
Ein Häkchenattribut steuert, ob ein Menüelement ausgewählt ist. Sie können das Häkchenattribut eines Menüelements mithilfe der CheckMenuItem-Funktion festlegen. Sie können die GetMenuState-Funktion verwenden, um zu bestimmen, ob derzeit ein Menüelement ausgewählt oder entfernt wird.
Anstelle von CheckMenuItem und GetMenuStatekönnen Sie die Funktionen GetMenuItemInfo und SetMenuItemInfo verwenden, um den Überprüfungszustand eines Menüelements abzurufen und fest zu legen.
Manchmal entspricht eine Gruppe von Menüelementen einer Reihe von Optionen, die sich gegenseitig ausschließen. In diesem Fall können Sie die ausgewählte Option mithilfe eines ausgewählten Optionsfeldmenüelements angeben (analog zu einem Optionsfeld-Steuerelement). Ausgewählte Optionselemente werden mit einer Aufzählungsbitmap anstelle einer Häkchenbitmap angezeigt. Um ein Menüelement zu überprüfen und zu einem Optionselement zu machen, verwenden Sie die CheckMenuElementItem-Funktion.
Standardmäßig zeigt das System ein Häkchen oder eine Aufzählungsbitmap neben ausgewählten Menüelementen und keine Bitmap neben deaktivierten Menüelementen an. Sie können jedoch die Funktion SetMenuItemBitmaps verwenden, um anwendungsdefinierte ausgewählte und markierte Bitmaps einem Menüelement zu zuordnen. Das System verwendet dann die angegebenen Bitmaps, um den ausgewählten oder cleared-Zustand des Menüelements anzugeben.
Anwendungsdefinierte Bitmaps, die einem Menüelement zugeordnet sind, müssen die gleiche Größe wie die Standard-Häkchenbitmap haben, deren Abmessungen je nach Bildschirmauflösung variieren können. Verwenden Sie die GetSystemMetrics-Funktion, um die richtigen Dimensionen abzurufen. Sie können mehrere Bitmapressourcen für unterschiedliche Bildschirmauflösungen erstellen. erstellen Sie eine Bitmapressource, und skalieren Sie sie bei Bedarf. oder erstellen Sie zur Laufzeit eine Bitmap, und zeichnen Sie ein Bild in ihr. Die Bitmaps können entweder monofarbig oder farblich sein. Da Menüelemente jedoch invertiert werden, wenn sie hervorgehoben sind, kann das Aussehen bestimmter invertierter Farbbitmaps unerwünscht sein. Weitere Informationen finden Sie unter Bitmaps.
Aktivierte, graue und deaktivierte Menüelemente
Ein Menüelement kann aktiviert, grau oder deaktiviert werden. Standardmäßig ist ein Menüelement aktiviert. Wenn der Benutzer ein aktiviertes Menüelement auswählt, sendet das System je nach Art des Menüelements eine Befehlsmeldung an das Besitzerfenster oder zeigt das entsprechende Untermenü an.
Wenn Menüelemente für den Benutzer nicht verfügbar sind, sollten sie abgeblendet oder deaktiviert sein. Graue und deaktivierte Menüelemente können nicht ausgewählt werden. Ein deaktiviertes Element sieht wie ein aktiviertes Element aus. Wenn der Benutzer auf ein deaktiviertes Element klickt, wird das Element nicht ausgewählt, und es geschieht nichts. Deaktivierte Elemente können beispielsweise in einem Tutorial nützlich sein, in dem ein Menü angezeigt wird, das aktiv aussieht, aber nicht ist.
Eine Anwendung graut ein nicht verfügbares Menüelement, um dem Benutzer einen visuellen Hinweis zu geben, dass ein Befehl nicht verfügbar ist. Sie können ein ausgegrautes Element verwenden, wenn eine Aktion nicht geeignet ist (z. B. können Sie den Befehl Drucken im Menü Datei grau halten, wenn auf dem System kein Drucker installiert ist).
Die EnableMenuItem-Funktion aktiviert, graut oder deaktiviert ein Menüelement. Verwenden Sie die GetMenuItemInfo-Funktion, um zu bestimmen, ob ein Menüelement aktiviert, grau oder deaktiviert ist.
Anstelle von GetMenuItemInfokönnen Sie auch die GetMenuState-Funktion verwenden, um zu bestimmen, ob ein Menüelement aktiviert, grau oder deaktiviert ist.
Hervorgehobene Menüelemente
Das System hebt Automatisch Menüelemente in Menüs hervor, wenn der Benutzer sie auswählt. Die Hervorhebung kann jedoch mithilfe der Funktion HiliteMenuItem explizit einem Menünamen auf der Menüleiste hinzugefügt oder daraus entfernt werden. Diese Funktion hat keine Auswirkungen auf Menüelemente in Menüs. Wenn HiliteMenuItem verwendet wird, um einen Menünamen hervorzuheben, scheint der Name jedoch nur ausgewählt zu sein. Wenn der Benutzer die EINGABETASTE drückt, wird das hervorgehobene Element nicht ausgewählt. Dieses Feature kann beispielsweise in einer Trainingsanwendung nützlich sein, die die Verwendung von Menüs veranschaulicht.
Owner-Drawn Menüelemente
Eine Anwendung kann die Darstellung eines Menüelements mithilfe eines vom Besitzer gezeichneten Elements vollständig steuern. Vom Besitzer gezeichnete Elemente erfordern, dass eine Anwendung die gesamt verantwortung für das Zeichnen ausgewählter (hervorgehobener), ausgewählter und klarter Zustände übernimmt. Wenn eine Anwendung z. B. ein Schriftartmenü bereitgestellt hat, könnte sie jedes Menüelement mithilfe der entsprechenden Schriftart zeichnen. das Element für Roman würde mit roman gezeichnet werden, das Element für italisch würde italisch gezeichnet werden, und so weiter. Weitere Informationen finden Sie unter Erstellen Owner-Drawn Menüelemente.
Menüelementtrennzeichen und Zeilenumbrüche
Das System stellt einen speziellen Typ von Menüelement zur Auswahl, das als Trennzeichen bezeichnet wird und als horizontale Linie angezeigt wird. Sie können ein Trennzeichen verwenden, um ein Menü in Gruppen verwandter Elemente zu unterteilen. Ein Trennzeichen kann nicht in einer Menüleiste verwendet werden, und der Benutzer kann kein Trennzeichen auswählen.
Wenn eine Menüleiste mehr Menünamen enthält, als in eine Zeile passen, umbricht das System die Menüleiste, indem es sie automatisch in zwei oder mehr Zeilen aufbricht. Sie können dazu führen, dass ein Zeilenumbruch an einem bestimmten Element auf einer Menüleiste auftritt, indem Sie dem Element das MFT _ MENUBREAK-Typflag zuweisen. Das System platziert dieses Element und alle nachfolgenden Elemente in einer neuen Zeile.
Wenn ein Menü mehr Elemente enthält, als in eine Spalte passen, wird das Menü abgeschnitten. Sie können dazu führen, dass ein Spaltenumbruch an einem bestimmten Element in einem Menü auftritt, indem Sie dem Element das MFT _ MENUBREAK-Typflag zuweisen oder die MENUBREAK-Option in der MENUITEM-Anweisung verwenden. Das System platziert dieses Element und alle nachfolgenden Elemente in einer neuen Spalte. Das MFT _ MENUBARBREAK-Typflag hat die gleiche Wirkung, mit der Ausnahme, dass zwischen der neuen und der alten Spalte eine vertikale Linie angezeigt wird.
Wenn Sie die Funktionen AppendMenu, InsertMenuoder ModifyMenu verwenden, um Zeilenumbrüche zu zuweisen, sollten Sie die Typflags MF _ MENUBREAK oder MF _ MENUBARBREAK zuweisen.
Mit Menüs verwendete Meldungen
Das System meldet menübezogene Aktivitäten, indem Es Meldungen an die Fensterprozedur des Fensters sendet, das das Menü besitzt. Das System sendet eine Reihe von Nachrichten, wenn der Benutzer Elemente in der Menüleiste auswählt oder auf die rechte Maustaste klickt, um ein Kontextmenü anzuzeigen.
Wenn der Benutzer ein Element auf der Menüleiste aktiviert, empfängt das Besitzerfenster zuerst eine WM _ SYSCOMMAND-Meldung. Diese Meldung enthält ein Flag, das angibt, ob der Benutzer das Menü über die Tastatur (SC KEYMENU) oder die Maus _ (SC _ MOUSEMENU) aktiviert hat. Weitere Informationen finden Sie unter Tastaturzugriff auf Menüs.
Als Nächstes sendet das System vor dem Anzeigen von Menüs die WM _ INITMENU-Nachricht an die Fensterprozedur, damit eine Anwendung die Menüs ändern kann, bevor sie dem Benutzer angezeigt werden. Das System sendet die WM _ INITMENU-Nachricht nur einmal pro Menüaktivierung.
Wenn der Benutzer auf ein Menüelement zeigt, das ein Untermenü öffnet, sendet das System dem Besitzerfenster die WM _ INITMENUPOPUP-Meldung, bevor das Untermenü angezeigt wird. Diese Meldung gibt der Anwendung die Möglichkeit, das Untermenü zu ändern, bevor es angezeigt wird.
Jedes Mal, wenn der Benutzer die Hervorhebung von einem Element zu einem anderen verschiebt, sendet das System eine WM _ MENUSELECT-Nachricht an die Fensterprozedur des Besitzerfensters des Menüs. Diese Meldung identifiziert das aktuell ausgewählte Menüelement. Viele Anwendungen stellen einen Informationsbereich am unteren Rand ihrer Hauptfenster zur Verfügung und verwenden diese Meldung, um zusätzliche Informationen zum ausgewählten Menüelement anzuzeigen.
Wenn der Benutzer ein Befehlselement aus einem Menü auswählt, sendet das System eine WM _ COMMAND-Meldung an die Fensterprozedur. Das niedrige Wort des wParam-Parameters der WM _ COMMAND-Nachricht enthält den Bezeichner des ausgewählten Elements. Die Fensterprozedur sollte den Bezeichner untersuchen und die Nachricht entsprechend verarbeiten.
Sie können Informationen für ein Menü mithilfe der MENUINFO-Struktur speichern. Wenn das Menü mit einem MENUINFO-Element definiert ist. dwStyle-Wert von MNS NOTIFYBYPOS, sendet das System _ WM _ MENUCOMMAND anstelle des _ WM-BEFEHLs, wenn ein Element ausgewählt wird. Dadurch können Sie auf die Informationen in der MENUINFO-Struktur zugreifen und den Index des ausgewählten Elements direkt anzeigen.
Nicht auf alle Menüs kann über die Menüleiste eines Fensters zugegriffen werden. Viele Anwendungen zeigen Kontextmenüs an, wenn der Benutzer an einer bestimmten Position mit der rechten Maustaste klickt. Solche Anwendungen sollten die WM _ CONTEXTMENU-Nachricht verarbeiten und gegebenenfalls ein Kontextmenü anzeigen. Wenn eine Anwendung kein Kontextmenü zeigt, sollte sie die WM _ CONTEXTMENU-Nachricht zur Standardverarbeitung an die DefWindowProc-Funktion übergeben.
Die WM _ MENURBUTTONUP-Meldung wird gesendet, wenn der Benutzer die rechte Maustaste loslässt, während sich der Cursor auf einem Menüelement befindet. Diese Meldung wird bereitgestellt, damit Anwendungen ein kontextsensitives Menü oder ein Kontextmenü für ein Menüelement anzeigen können.
Es gibt einige Meldungen, die nur Drag & Drop-Menüs umfassen. The WM_MENUGETOBJECT is sent to the owner of a drag-and-drop menu when the mouse cursor enters a menu item or moves from the center of an item to the top or the bottom of an item. Die WM _ MENUDRAG-Meldung wird gesendet, wenn der Benutzer tatsächlich ein Menüelement zieht.
Wenn ein Dropdownmenü oder ein Untermenü zerstört wurde, sendet das System eine WM _ UNINITMENUPOPUP-Nachricht.
Menüvernichtung
Wenn ein Menü einem Fenster zugewiesen wird und dieses Fenster zerstört wird, zerstört das System automatisch das Menü und seine Untermenüs und gibt das Handle des Menüs und den vom Menü belegten Arbeitsspeicher frei. Das System zerstört nicht automatisch ein Menü, das einem Fenster nicht zugewiesen ist. Eine Anwendung muss das nicht zugewiesene Menü durch Aufrufen der DestroyMenu-Funktion zerstören. Andernfalls ist das Menü auch nach dem Schließen der Anwendung weiterhin im Arbeitsspeicher vorhanden. Um das aktive Menü des aufrufenden Threads zu beenden, verwenden Sie EndMenu. Wenn eine Plattform EndMenu nicht unterstützt, senden Sie dem Besitzer des aktiven Menüs eine WM _ CANCELMODE-Nachricht.