Freigeben über


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 dazu, dass ein Befehl ausgeführt wird. Dieser Abschnitt enthält Informationen zu den folgenden Themen:

Ein Menü wird in einer Hierarchie angeordnet. Auf der obersten Ebene der Hierarchie befindet sich die Menüleiste; enthält eine Liste von Menüs, 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 ausführt, wird als Befehlselement oder Befehl bezeichnet.

Ein Element auf der Menüleiste öffnet fast immer ein Menü. Menüleisten enthalten selten Befehlselemente. Ein Menü, das über die Menüleiste geöffnet wird, klappt von dort nach unten aus und wird manchmal auch als Dropdown-Menü 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 bereitstellt. 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. Eine Menüleiste kann z. B . einen Dateinamen enthalten, der, wenn der Benutzer darauf klickt, ein Menü mit Menüelementen wie "Neu", " Öffnen" und "Speichern" aktiviert. Rufen Sie GetMenuBarInfo auf, um Informationen zu einer Menüleiste abzurufen.

Nur ein überlappendes oder Popup-Fenster kann eine Menüleiste enthalten; ein untergeordnetes Fenster kann keine 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 nicht sichtbar, bis 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 bietet auch Schnellzugriffsmenüs. Ein Kontextmenü ist nicht an die Menüleiste angefügt. Es kann an einer beliebigen Stelle auf dem Bildschirm angezeigt werden. Eine Anwendung ordnet in der Regel ein Kontextmenü einem Teil 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 Caret- oder Mauscursors angezeigt.

Das Menü "Fenster"

Das Fenstermenü (auch bekannt als Systemmenü oder Steuerelementmenü ) ist ein Popupmenü, das fast ausschließlich vom Betriebssystem definiert und verwaltet wird. Der Benutzer kann das Fenstermenü öffnen, indem er auf das Anwendungssymbol auf der Titelleiste klickt oder mit der rechten Maustaste auf eine beliebige Stelle auf der Titelleiste klickt.

Das Menü "Fenster" stellt einen Standardsatz von Menüelementen bereit, 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 ein Fenstermenü haben. Es ist ungewöhnlich, dass ein überlappende oder Popupfenster kein Fenstermenü enthält.

Wenn der Benutzer im Menü "Fenster " einen Befehl auswählt, sendet das System eine WM_SYSCOMMAND Nachricht an das Besitzerfenster des Menüs. In den meisten Anwendungen verarbeitet die Fensterprozedur keine Nachrichten aus dem Fenstermenü. Stattdessen übergibt sie die Nachrichten einfach an die DefWindowProc-Funktion für die Systemstandardverarbeitung der Nachricht. 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, um sie zu ändern. Jedes Fenster, das die GetSystemMenu-Funktion nicht verwendet, um eine eigene Kopie des Fenstermenüs zu erstellen, erhält das Standardfenstermenü.

Hilfskennung

Jedem Menüleiste, Menü, Untermenü und Kontextmenü ist eine Hilfe-Identifikator zugeordnet. Wenn der Benutzer F1 drückt, während das Menü aktiv ist, wird dieser Wert als Teil einer WM_HELP 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 Mnemonic-Zugriffstasten und Schnellzugriffstasten für Ihre Menüelemente bereitstellen.

In den folgenden Themen werden die standardmäßige Tastaturschnittstelle, Zugriffstasten und Tastenkombinationen beschrieben:

Standardtastataturschnittstelle

Das System ist so konzipiert, dass es mit oder ohne Maus oder anderes Zeigegerät funktioniert. 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, ob der Benutzer ein Menüelement über die Tastatur oder mithilfe einer Maus auswählt. Die Standardmäßige Tastaturschnittstelle verarbeitet die folgenden Tastenanschläge.

Tastendruck Maßnahme
Alphabetisches Zeichen Wählt das erste Menüelement mit dem angegebenen Zeichen als Zugriffstaste 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 dieser Tastenanschlag das Element so aus, als ob der Benutzer die Maustaste losgelassen hat, während das Element ausgewählt wurde.
ESC Beendet den Menümodus.
LINKSPFEIL Wechselt zyklisch zum vorherigen Menüpunkt der obersten Ebene. Menüelemente der obersten Ebene umfassen Menünamen und das Fenstermenü. Wenn sich das ausgewählte Element in einem Menü befindet, wird die vorherige Spalte im Menü ausgewählt oder das vorherige Menüelement der obersten Ebene ausgewählt.
RECHTSPFEIL Funktioniert wie die NACH-LINKS-TASTE, außer in der entgegengesetzten Richtung. In Menüs bewegt sich dieser Tastenanschlag um eine Spalte vorwärts; 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 er in einem Menünamen gedrückt wird. Wenn im Menü die Pfeil-nach-oben-Taste gedrückt wird, wird das vorherige Element ausgewählt. Die Pfeil-nach-unten-Taste wählt das nächste Element aus.

 

Die Standardmäßige Tastaturschnittstelle für Menüs kann durch Hinzufügen von Zugriffstasten (Mnemonics) zu Menüelementen verbessert werden. Eine Zugriffstaste 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 die ALT-TASTE gedrückt wird, um das erste Element auf der Menüleiste hervorzuheben. Ein Menü ist aktiv, wenn es angezeigt wird.

Um eine Zugriffstaste für ein Menüelement zu erstellen, setzen Sie ein kaufmännisches Und-Zeichen vor ein beliebiges Zeichen in der Textzeichenfolge des Elements. Beispielsweise bewirkt die Textzeichenfolge "&Move", dass das System den Buchstaben "M" unterstreicht.

Zusätzlich zu einer Zugriffstaste 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 Zugriffstaste immer einem Menüelement zugeordnet, während eine Tastenkombination in der Regel (aber nicht erforderlich) einem Menüelement zugeordnet ist.

Der Text, der die Tastenkombination identifiziert, wird dem Textstring des Menüelements hinzugefügt. Der Verknüpfungstext wird rechts neben dem Namen des Menüelements nach einem Backslash und Tab-Zeichen (\t) angezeigt. Beispielsweise stellt "&Close\tAlt+F4" einen Befehl "Schließen" mit der TASTENkombination ALT+F4 als Tastenkombination und mit dem Buchstaben "C" als Zugriffstaste dar. Weitere Informationen finden Sie unter Tastenkombinationen.

Sie können ein Menü entweder mit einer Menüvorlage oder 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 auch Menüvorlagenressourcen dynamisch im Arbeitsspeicher erstellen.

In den folgenden Themen wird die Menüerstellung ausführlich beschrieben:

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 allen Menüs. Informationen zum Erstellen einer Menüvorlagenressource finden Sie in der Dokumentation, die in Ihren Entwicklungstools enthalten ist.

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 an 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.

Das Implementieren von Menüs als Ressourcen erleichtert die Lokalisierung 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.

Ein Menü kann aus einer Menüvorlage erstellt werden, die zur Laufzeit im Arbeitsspeicher integriert ist. Beispielsweise kann eine Anwendung, die es einem Benutzer ermöglicht, sein Menü anzupassen, eine Menüvorlage im Arbeitsspeicher basierend auf den Einstellungen des Benutzers erstellen. Die Anwendung kann dann die Vorlage in einer Datei oder in der Registrierung für die zukünftige Verwendung speichern. Verwenden Sie die LoadMenuIndirect-Funktion , um ein Menü aus einer Vorlage im Arbeitsspeicher zu erstellen. Beschreibungen von Menüvorlagenformaten 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.

Das System generiert eine eindeutige Kennung für jedes Menü. Ein Menügriff ist ein Wert des Typs HMENU. Eine Anwendung muss bei vielen Menüfunktionen einen Menühandle angeben. Sie erhalten ein Handle zu einer Menüleiste, wenn Sie das Menü erstellen oder eine Menüressource laden.

Verwenden Sie die GetMenu-Funktion , um ein Handle zur Menüleiste für ein erstelltes oder geladenes Menü abzurufen. Zum Abrufen eines Handles zum Untermenü, das einem Menüelement zugeordnet ist, verwenden Sie die Funktion "GetSubMenu " oder "GetMenuItemInfo" . Verwenden Sie zum Abrufen eines Handles zu einem Fenstermenü die GetSystemMenu-Funktion .

Mithilfe von Menüerstellungsfunktionen können Sie Menüs zur Laufzeit erstellen oder menüelemente zu vorhandenen Menüs hinzufügen. Mit der CreateMenu-Funktion können Sie eine leere Menüleiste und die CreatePopupMenu-Funktion erstellen, um ein leeres Menü zu erstellen. Mithilfe der MENUINFO-Struktur können Sie bestimmte Einstellungsinformationen für ein Menü speichern. Um die Einstellungen eines Menüs abzurufen oder abzurufen, verwenden Sie GetMenuInfo oder SetMenuInfo. Verwenden Sie die InsertMenuItem-Funktion , um einem Menü Elemente hinzuzufügen. Die älteren Funktionen AppendMenu und InsertMenu werden weiterhin unterstützt, aber InsertMenuItem sollte für neue Anwendungen verwendet werden.

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 Funktion CreateWindow oder CreateWindowEx angeben oder die SetMenu-Funktion aufrufen.

Um ein Kontextmenü anzuzeigen, verwenden Sie die Funktion TrackPopupMenuEx . Kontextmenüs, auch als schwebende Popupmenüs bezeichnet, werden normalerweise angezeigt, wenn die WM_CONTEXTMENU Nachricht verarbeitet wird.

Ein Menü können Sie jedem Fenster zuweisen, das kein untergeordnetes Fenster ist.

Die ältere TrackPopupMenu-Funktion wird weiterhin unterstützt, aber neue Anwendungen sollten die TrackPopupMenuEx-Funktion verwenden.

Menüs der Fensterklassen

Sie können ein Standardmenü angeben, das als Klassenmenü bezeichnet wird, wenn Sie eine Fensterklasse registrieren. Dazu weisen Sie dem lpszMenuName-Element der WNDCLASS-Struktur , die zum Registrieren der Klasse verwendet wird, den Namen der Menüvorlagenressource zu.

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ühandle angeben. Sie können auch das Menü eines Fensters ändern, nachdem es mithilfe der SetMenu-Funktion erstellt wurde. Weitere Informationen finden Sie unter Fensterklassen.

In den folgenden Themen wird erläutert, was das System tut, 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

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, das ein Untermenü öffnet, ist ein Handle für das entsprechende Untermenü zugeordnet. Wenn der Benutzer auf ein solches Element verweist, öffnet das System das Untermenü. Es wird keine Befehlsnachricht an das Besitzerfenster gesendet. Das System sendet jedoch eine WM_INITMENUPOPUP Nachricht an das Besitzerfenster, bevor das Untermenü angezeigt wird. Mit der GetSubMenu - oder GetMenuItemInfo-Funktion können Sie ein Handle zum Einem Element zugeordneten Untermenü abrufen.

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 jeder beliebigen Tiefe verschachteln. Um einen visuellen Hinweis für den Benutzer bereitzustellen, zeigt das System automatisch einen kleinen Pfeil rechts neben dem Text eines Menüelements an, das ein Untermenü öffnet.

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 Bezeichner des Elements als Teil einer WM_COMMAND Nachricht 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 mithilfe seines Bezeichners angeben, wenn Sie Menüfunktionen aufrufen. Um beispielsweise ein Menüelement zu aktivieren oder zu deaktivieren.

Menüelemente, die Untermenüs öffnen, weisen Bezeichner genauso wie Befehlselemente auf. Das System sendet jedoch keine Befehlsmeldung, wenn ein solches Element aus einem Menü ausgewählt wird. Stattdessen öffnet das System das dem Menüelement zugeordnete Untermenü.

Um den Bezeichner des Menüelements an einer angegebenen Position abzurufen, verwenden Sie die Funktion "GetMenuItemID " oder "GetMenuItemInfo" .

Zusätzlich zu einem eindeutigen Bezeichner verfügt jedes Menüelement in einer Menüleiste oder einem Menü über einen eindeutigen Positionswert. Das am weitesten links stehende Element in einer Menüleiste oder das oberste Element in einem Menü weist Die Position Null auf. Der Positionswert wird für nachfolgende Menüelemente erhöht. Das System weist allen Elementen in einem Menü, einschließlich Trennzeichen, einen Positionswert zu. Die folgende Abbildung zeigt die Positionswerte von Elementen in einer Menüleiste und in einem Menü.

Menüleiste und Menü

Beim Aufrufen einer Menüfunktion, die Informationen zu einem bestimmten Menüelement ändert oder abruft, können Sie das Element entweder mithilfe des Bezeichners oder seiner Position angeben. Weitere Informationen finden Sie im nächsten Abschnitt.

Programmgesteuertes Zugreifen auf Menüelemente

Mit den meisten Menüfunktionen können Sie ein Menüelement entweder nach Position oder Befehl angeben. Einige Funktionen verwenden die MF_BYPOSITION und MF_BYCOMMAND Flags, um den Suchalgorithmus anzugeben; andere haben 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 nach Befehl angeben, werden das Menü und dessen Untermenüs nach einem Element gesucht, dessen Menübezeichner der angegebenen Elementnummer entspricht. Wenn mehr als ein Element in der Menühierarchie mit der Elementnummer übereinstimmt, 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 ein Untermenü durch Doppelklicken öffnet, sendet das System eine Befehlsmeldung an das Besitzerfenster des Menüs und schließt das Menü so, als ob das Standardbefehlselement ausgewählt wurde. Wenn kein Standardbefehlselement vorhanden ist, 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 gelöschte Menüelemente

Ein Menüelement kann entweder ausgewählt oder gelöscht werden. Das System zeigt eine Bitmap neben ausgewählten Menüelementen an, um den ausgewählten Zustand anzugeben. Das System zeigt keine Bitmap neben dem Löschen von Elementen an, es sei denn, es wird eine anwendungsdefinierte "clear"-Bitmap angegeben. Nur Menüelemente in einem Menü können ausgewählt werden; Elemente in einer Menüleiste können nicht ausgewählt werden.

Anwendungen aktivieren oder deaktivieren 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ü ein- oder ausblenden kann. Wenn die Symbolleiste ausgeblendet ist, ist das Menüelement "Symbolleiste" sichtbar. Wenn der Benutzer den Befehl auswählt, überprüft die Anwendung das Menüelement und zeigt die Symbolleiste an.

Ein Häkchen-Attribut steuert, ob ein Menüelement ausgewählt ist. Sie können das Häkchen-Attribut eines Menüelements mithilfe der CheckMenuItem-Funktion festlegen. Mit der GetMenuState-Funktion können Sie bestimmen, ob ein Menüelement aktuell ausgewählt oder gelöscht ist.

Anstelle von CheckMenuItem und GetMenuState können Sie die Funktionen "GetMenuItemInfo " und "SetMenuItemInfo " verwenden, um den Überprüfungsstatus eines Menüelements abzurufen und festzulegen.

Manchmal entspricht eine Gruppe von Menüelementen einer Gruppe sich gegenseitig ausschließenden Optionen. In diesem Fall können Sie die ausgewählte Option mithilfe eines ausgewählten Optionsfeldelements (analog zu einem Optionsfeld-Steuerelement) angeben. Ausgewählte Optionselemente werden mit einer Aufzählungszeichenbitmap anstelle einer Häkchenbitmap angezeigt. Verwenden Sie die CheckMenuRadioItem-Funktion, um ein Menüelement zu überprüfen und es zu einem Radioelement zu machen.

Standardmäßig zeigt das System neben ausgewählten Menüelementen ein Häkchen oder eine Punkt-Bitmap und keine Bitmap neben nicht ausgewählten Menüelementen an. Sie können jedoch die SetMenuItemBitmaps-Funktion verwenden, um anwendungsdefinierte ausgewählte und gelöschte Bitmaps einem Menüelement zuzuordnen. Das System verwendet dann die angegebenen Bitmaps, um den ausgewählten oder gelöschten Zustand des Menüelements anzugeben.

Anwendungsdefinierte Bitmaps, die einem Menüelement zugeordnet sind, müssen dieselbe Größe aufweisen wie die Standardmäßige Häkchenbitmap, 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 darin. Die Bitmaps können entweder monochrom oder farblich sein. Da Menüelemente jedoch invertiert werden, wenn sie hervorgehoben sind, kann das Erscheinungsbild einiger invertierter Farbbitmaps unerwünscht sein. Weitere Informationen finden Sie unter Bitmaps.

Aktivierte, graue und deaktivierte Menüelemente

Ein Menüelement kann aktiviert, abgeblend oder deaktiviert werden. Standardmäßig ist ein Menüelement aktiviert. Wenn der Benutzer ein aktiviertes Menüelement auswählt, sendet das System eine Befehlsmeldung an das Besitzerfenster oder zeigt das entsprechende Untermenü an, je nachdem, welche Art von Menüelement es ist.

Wenn Menüelemente für den Benutzer nicht verfügbar sind, sollten sie grau 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 nichts geschieht. Deaktivierte Elemente können beispielsweise in einem Lernprogramm hilfreich sein, das ein Menü darstellt, das aktiv aussieht, aber nicht.

Eine Anwendung macht ein nicht verfügbares Menüelement grau, um dem Benutzer einen visuellen Hinweis bereitzustellen, dass ein Befehl nicht verfügbar ist. Sie können ein graues Element verwenden, wenn eine Aktion nicht geeignet ist (z. B. können Sie den Befehl "Drucken " im Menü "Datei " grau anzeigen, wenn das System keinen Drucker installiert hat).

Die EnableMenuItem-Funktion aktiviert, grau oder deaktiviert ein Menüelement. Verwenden Sie die GetMenuItemInfo-Funktion , um zu bestimmen, ob ein Menüelement aktiviert, abgeblend oder deaktiviert ist.

Anstelle von GetMenuItemInfo können Sie auch die GetMenuState-Funktion verwenden, um zu bestimmen, ob ein Menüelement aktiviert, abgeblend oder deaktiviert ist.

Hervorgehobene Menüelemente

Das System hebt Menüelemente automatisch in Menüs hervor, während der Benutzer sie auswählt. Hervorhebungen können jedoch mithilfe der HiliteMenuItem-Funktion explizit hinzugefügt oder aus einem Menünamen auf der Menüleiste entfernt werden. Diese Funktion wirkt sich nicht auf Menüelemente in Menüs aus. 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 Schulungsanwendung hilfreich 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. Für vom Besitzer gezeichnete Elemente ist eine Anwendung erforderlich, um die Gesamtverantwortung für das Zeichnen ausgewählter (hervorgehobener), ausgewählter und gelöschter Zustände zu übernehmen. Wenn eine Anwendung beispielsweise ein Schriftartmenü bereitstellt, könnte sie jede Menüoption in der entsprechenden Schriftart darstellen: Das Element für Roman wird dann in Roman und das Element für Kursiv in kursiv dargestellt, und so weiter. Weitere Informationen finden Sie unter Erstellen Owner-Drawn Menüelemente.

Das System stellt einen speziellen Menüelementtyp bereit, der als Trennzeichen bezeichnet wird und als horizontale Linie angezeigt wird. Sie können ein Trennzeichen verwenden, um ein Menü in Gruppen verwandter Elemente aufzuteilen. 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, umschließt das System die Menüleiste, indem sie automatisch in zwei oder mehr Zeilen unterteilt wird. Sie können dazu führen, dass bei einem bestimmten Element in einer Menüleiste ein Zeilenumbruch auftritt, indem Sie dem Element die MFT_MENUBREAK Typkennzeichnung 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 bei einem bestimmten Element in einem Menü ein Spaltenumbruch auftritt, indem Sie dem Element die MFT_MENUBREAK Typkennzeichnung zuweisen oder die MENUBREAK-Option in der MENUITEM-Anweisung verwenden. Das System platziert dieses Element und alle nachfolgenden Elemente in einer neuen Spalte. Die MFT_MENUBARBREAK Typflagge hat denselben Effekt, außer dass eine vertikale Linie zwischen der neuen und der alten Spalte angezeigt wird.

Wenn Sie die Funktionen AppendMenu, InsertMenu oder ModifyMenu verwenden, um Zeilenumbrüche zuzuweisen, sollten Sie die Typkennzeichnungen MF_MENUBREAK oder MF_MENUBARBREAK zuweisen.

Mit Menüs verwendete Nachrichten

Das System meldet menübezogene Aktivitäten, indem Nachrichten an die Fensterprozedur des Fensters gesendet werden, das das Menü besitzt. Das System sendet eine Reihe von Nachrichten, wenn der Benutzer Elemente auf 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 Nachricht. Diese Meldung enthält eine Kennzeichnung, die angibt, ob der Benutzer das Menü mithilfe der Tastatur (SC_KEYMENU) oder der 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 der Benutzer sie sieht. 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 das Besitzerfenster an die WM_INITMENUPOPUP Nachricht, bevor das Untermenü angezeigt wird. Diese Meldung bietet der Anwendung die Möglichkeit, das Untermenü zu ändern, bevor es angezeigt wird.

Jedes Mal, wenn der Benutzer die Hervorhebung von einem Element in ein anderes verschiebt, sendet das System eine WM_MENUSELECT Nachricht an die Fensterprozedur des Besitzerfensters des Menüs. Diese Nachricht identifiziert das aktuell ausgewählte Menüelement. Viele Anwendungen stellen unten in den Hauptfenstern einen Informationsbereich bereit 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 Nachricht an die Fensterprozedur. Das niederwertige Wort des wParam-Parameters der WM_COMMAND-Nachricht enthält die Kennung 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 einer MENUINFO und einem dwStyle-Wert von MNS_NOTIFYBYPOS definiert ist, sendet das System WM_MENUCOMMAND anstelle von WM_COMMAND, wenn ein Element ausgewählt wird. Auf diese Weise können Sie auf die Informationen in der MENUINFO-Struktur zugreifen und auch direkt den Index des ausgewählten Elements erhalten.

Nicht alle Menüs sind über die Menüleiste eines Fensters zugänglich. Viele Anwendungen zeigen Kontextmenüs an, wenn der Benutzer an einer bestimmten Position auf die rechte Maustaste klickt. Solche Anwendungen sollten die WM_CONTEXTMENU Nachricht verarbeiten und gegebenenfalls ein Kontextmenü anzeigen. Wenn eine Anwendung kein Kontextmenü anzeigt, sollte sie die WM_CONTEXTMENU Nachricht zur Standardverarbeitung an die DefWindowProc-Funktion übergeben.

Die WM_MENURBUTTONUP Nachricht 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 kontextabhängiges oder Shortcut-Menü für ein Menüelement anzeigen können.

Es gibt einige Nachrichten, die nur Drag-and-Drop-Menüs umfassen. Die WM_MENUGETOBJECT wird an den Besitzer eines Drag-and-Drop-Menüs gesendet, wenn der Mauszeiger ein Menüelement eingibt oder von der Mitte eines Elements zum oberen oder unteren Rand eines Elements wechselt. Die WM_MENUDRAG Nachricht 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.

Wenn einem Fenster ein Menü zugewiesen ist und dieses Fenster zerstört wird, zerstört das System automatisch das Menü und dessen Untermenüs, wobei der Handle des Menüs und der vom Menü belegte Speicher freigegeben werden. Das System zerstört nicht automatisch ein Menü, das keinem Fenster zugewiesen ist. Eine Anwendung muss das nicht zugewiesene Menü zerstören, indem die DestroyMenu-Funktion aufgerufen wird. Andernfalls ist das Menü auch nach dem Schließen der Anwendung im Arbeitsspeicher weiterhin vorhanden. Verwenden Sie " EndMenu", um das aktive Menü des aufrufenden Threads zu beenden. Wenn eine Plattform EndMenu nicht unterstützt, senden Sie dem Besitzer des aktiven Menüs eine WM_CANCELMODE Nachricht.