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 einen Befehl aus. Dieser Abschnitt enthält Informationen zu den folgenden Themen:

Ein Menü ist 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ü auf oberster 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 in der Menüleiste öffnet fast immer ein Menü. Menüleisten enthalten selten Befehlselemente. Ein über die Menüleiste geöffnetes Menü wird von der Menüleiste nach unten angezeigt und manchmal auch 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 Standard Kategorien von Befehlen dar, die eine Anwendung bereitstellt. Wenn Sie auf 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, 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 zu erhalten.

Nur ein überlappende Fenster oder Popupfenster kann eine Menüleiste enthalten. Ein untergeordnetes Fenster kann keines 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 Fenstern 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 Kontextmenüs. Ein Kontextmenü ist nicht an die Menüleiste angefügt. sie kann an einer beliebigen Stelle auf dem Bildschirm angezeigt werden. Eine Anwendung ordnet einem Teil eines Fensters, z. B. dem Clientbereich, oder einem bestimmten Objekt, z. B. einem Symbol, in der Regel ein Kontextmenü zu. 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 Mauszeigers angezeigt.

Fenstermenü

Das Menü Fenster (auch als Systemmenü 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 das Anwendungssymbol in der Titelleiste klickt oder mit der rechten Maustaste auf eine beliebige Stelle auf der Titelleiste klickt.

Das Menü Fenster enthält 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 Überlappungs-, Popup- oder untergeordnetes Fenster kann über ein Fenstermenü verfügen. Es ist ungewöhnlich, dass ein Überlappungs- oder Popupfenster kein Fenstermenü enthält.

Wenn der Benutzer einen Befehl aus dem Menü Fenster auswäht, 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 übergeben sie die Nachrichten einfach an die DefWindowProc-Funktion zur 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 zu ändernden Standardfenstermenüs zu erstellen. Jedes Fenster, das nicht die GetSystemMenu-Funktion verwendet, um eine eigene Kopie des Fenstermenüs zu erstellen, erhält das Standardfenstermenü.

Hilfebezeichner

Jedem Menüleisten, Menü, Untermenü und Kontextmenü zugeordnet ist ein Hilfebezeichner. Wenn der Benutzer die F1-Taste drückt, während das Menü aktiv ist, wird dieser Wert im Rahmen einer WM_HELP-Nachricht an das Besitzerfenster gesendet.

Tastaturzugriff auf Menüs

Das System bietet eine Standardtastataturschnittstelle für Menüs. Sie können diese Benutzeroberfläche verbessern, indem Sie mnemonische Zugriffstasten und Tastenkombinationen (Tastenkombinationen) für Ihre Menüelemente bereitstellen.

In den folgenden Themen werden die Standardtastataturschnittstelle, Zugriffstasten und Tastenkombinationen beschrieben:

Standardtastataturschnittstelle

Das System ist für die Verwendung mit oder ohne Maus oder ein anderes Zeigegerät konzipiert. Da das System eine Standardtastataturschnittstelle bietet, kann der Benutzer die Tastatur verwenden, um Menüelemente auszuwählen. Für diese Tastaturschnittstelle ist kein spezieller Code erforderlich. Eine Anwendung erhält eine Befehlsmeldung, ob der Benutzer ein Menüelement über die Tastatur oder mithilfe einer Maus auswählt. Die Standardtastataturschnittstelle verarbeitet die folgenden Tastenanschläge.

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 Tastenkombination 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 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.
NACH-RECHTS-TASTE Funktioniert wie die NACH-LINKS-TASTE, außer in entgegengesetzter Richtung. In Menüs wird diese Tastenkombination um eine Spalte nach vorne verschoben. wenn sich das aktuell ausgewählte Element in der spalte ganz rechts befindet, ist das nächste Menü ausgewählt.
NACH-OBEN- ODER NACH-UNTEN-PFEILE 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. durch die NACH-UNTEN-TASTE wird das nächste Element ausgewählt.

 

Die Standardtastataturschnittstelle für Menüs kann durch Hinzufügen von Zugriffstasten (Mnemonics) zu Menüelementen erweitert 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 eine Zugriffsschlüssel für ein Menüelement zu erstellen, stellen Sie jedem Zeichen in der Textzeichenfolge des Elements ein Ampersand voran. 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 ein Zugriffsschlüssel immer einem Menüelement zugeordnet, während eine Tastenkombination normalerweise (aber nicht sein muss) einem Menüelement zugeordnet ist.

Text, der die Tastenkombination identifiziert, wird der Textzeichenfolge des Menüelements hinzugefügt. Der Verknüpfungstext wird rechts neben dem Namen des Menüelements nach einem umgekehrten Schrägstrich und einem Tabulatorzeichen (\t) angezeigt. "&Close\tAlt+F4" stellt beispielsweise einen Close-Befehl mit der Tastenkombination ALT+F4 als Tastenkombination und dem Buchstaben "C" als Zugriffsschlüssel dar. Weitere Informationen finden Sie unter Tastaturbeschleunigungen.

Sie können ein Menü entweder mit 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:

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, die mit 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 zum 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 vereinfacht 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.

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, basierend auf den Einstellungen des Benutzers eine Menüvorlage im Arbeitsspeicher erstellen. Die Anwendung könnte die Vorlage dann für die zukünftige Verwendung in einer Datei oder in der Registrierung speichern. Um ein Menü aus einer Vorlage im Arbeitsspeicher zu erstellen, verwenden Sie die LoadMenuIndirect-Funktion . Beschreibungen von Menüvorlagenformaten finden Sie unter Menüvorlagenressourcen.

Eine Standardmenüvorlage besteht aus einer MENUITEMTEMPLATEHEADER-Struktur gefolgt von mindestens einer MENUITEMTEMPLATE-Struktur .

Eine erweiterte Menüvorlage besteht aus einer MENUEX_TEMPLATE_HEADER-Struktur gefolgt von einer oder mehreren MENUEX_TEMPLATE_ITEM Strukturen.

Das System generiert für jedes Menü einen eindeutigen Handle. Ein Menühandle ist ein Wert des HMENU-Typs . Eine Anwendung muss in vielen Menüfunktionen einen 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 in der Menüleiste für ein Menü abzurufen, das erstellt oder geladen wurde. Um ein Handle zum Untermenü abzurufen, das einem Menüelement zugeordnet ist, verwenden Sie die Funktion GetSubMenu oder GetMenuItemInfo . Verwenden Sie die GetSystemMenu-Funktion , um ein Handle in ein Fenstermenü abzurufen.

Mithilfe von Menüerstellungsfunktionen können Sie Menüs zur Laufzeit erstellen oder vorhandenen Menüs Menüelemente hinzufügen. Sie können die CreateMenu-Funktion 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. Um einem Menü Elemente hinzuzufügen, verwenden Sie die Funktion InsertMenuItem . Die älteren Funktionen AppendMenu und InsertMenu werden weiterhin unterstützt, insertMenuItem sollte jedoch 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 Fensterklassenmenüs. 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.

Verwenden Sie die Funktion TrackPopupMenuEx , um ein Kontextmenü anzuzeigen. Kontextmenüs, auch als schwebende 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.

Fensterklassenmenüs

Beim Registrieren einer Fensterklasse können Sie ein Standardmenü angeben, das als Klassenmenü bezeichnet wird. Dazu weisen Sie den Namen der Menüvorlageressource 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ühandle angeben. Sie können das Menü eines Fensters auch ändern, nachdem es erstellt wurde, indem Sie die SetMenu-Funktion verwenden. Weitere Informationen finden Sie unter Fensterklassen.

In den folgenden Themen wird erläutert, was das System tut, wenn der Benutzer ein Menüelement auswäht, 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äht, sendet das System eine Befehlsnachricht 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 zum entsprechenden Untermenü. 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. Sie können ein Handle für das Untermenü abrufen, das einem Element zugeordnet ist, indem Sie die Funktion GetSubMenu oder GetMenuItemInfo verwenden.

Eine Menüleiste enthält in der Regel Menünamen, kann aber auch Befehlselemente enthalten. Ein Untermenü enthält normalerweise 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 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 zugeordnet ist eine eindeutige, anwendungsdefinierte ganze Zahl, die als Menüelementbezeichner bezeichnet wird. Wenn der Benutzer ein Befehlselement aus einem Menü auswäht, sendet das System den Bezeichner des Elements im Rahmen einer WM_COMMAND Nachricht an das Besitzerfenster. Die Fensterprozedur untersucht den Bezeichner, um die Quelle der Nachricht zu ermitteln, und verarbeitet die Nachricht entsprechend. Darüber hinaus können Sie ein Menüelement mit dessen Bezeichner angeben, wenn Sie Menüfunktionen aufrufen. Beispielsweise, um ein Menüelement zu aktivieren oder zu deaktivieren.

Menüelemente, die Untermenüs öffnen, verfügen genau wie Befehlselemente über Bezeichner. 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 linksste Element in einer Menüleiste oder das oberste Element in einem Menü hat position null. 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 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 per Position oder per 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 per Befehl angeben, werden das Menü und die zugehörigen 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 Befehlsnachricht an das Besitzerfenster des Menüs und schließt das Menü, 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 deren ausgewählten Zustand anzugeben. Das System zeigt keine Bitmap neben löschenden Elementen an, es sei denn, es wird eine durch die Anwendung definierte "clear"-Bitmap 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 in Kraft 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 deaktiviert. Wenn der Benutzer den Befehl auswäht, ü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 festlegen, indem Sie die CheckMenuItem-Funktion verwenden. Sie können die GetMenuState-Funktion verwenden, um zu bestimmen, ob ein Menüelement derzeit ausgewählt oder gelöscht wird.

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 Reihe von Optionen, die sich gegenseitig ausschließen. In diesem Fall können Sie die ausgewählte Option angeben, indem Sie ein ausgewähltes Optionsmenüelement (analog zu einem Optionsfeldsteuerelement) verwenden. Ausgewählte Optionselemente werden mit einem Aufzählungszeichen anstelle einer Häkchen-Bitmap angezeigt. Verwenden Sie die Funktion CheckMenuRadioItem , um ein Menüelement zu überprüfen und zu einem Optionselement zu machen.

Standardmäßig zeigt das System ein Häkchen oder Aufzählungszeichen neben ausgewählten Menüelementen und keine Bitmap neben gelöschten 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 Status des Menüelements anzugeben.

Anwendungsdefinierte Bitmaps, die einem Menüelement zugeordnet sind, müssen die gleiche Größe wie die Standard-Häkchen-Bitmap aufweisen, 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 farbig sein. Da Menüelemente jedoch invertiert sind, wenn sie hervorgehoben sind, kann das Auftreten bestimmter invertierter Farbbittebits nicht erwünscht sein. Weitere Informationen finden Sie unter Bitmaps.

Aktivierte, graue und deaktivierte Menüelemente

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

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 z. B. in einem Tutorial nützlich sein, in dem ein Menü angezeigt wird, das aktiv aussieht, aber nicht.

Eine Anwendung graut ein nicht verfügbares Menüelement ab, um dem Benutzer einen visuellen Hinweis zu geben, dass ein Befehl nicht verfügbar ist. Sie können ein abgeblendetes Element verwenden, wenn eine Aktion nicht geeignet ist (z. B. können Sie den Befehl Drucken im Menü Datei ergrauen, wenn auf dem System kein Drucker installiert ist).

Die EnableMenuItem-Funktion aktiviert, graut oder deaktiviert ein Menüelement. Um zu bestimmen, ob ein Menüelement aktiviert, abgeblendet oder deaktiviert ist, verwenden Sie die GetMenuItemInfo-Funktion .

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

Hervorgehobene Menüelemente

Das System hebt Menüelemente automatisch in Menüs hervor, wenn der Benutzer sie auswählt. Die Hervorhebung kann jedoch mithilfe der HiliteMenuItem-Funktion 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 zum Hervorheben eines Menünamens verwendet wird, wird der Name jedoch nur ausgewählt angezeigt. Wenn der Benutzer die EINGABETASTE drückt, wird das hervorgehobene Element nicht ausgewählt. Dieses Feature kann z. B. in einer Trainingsanwendung nützlich sein, die die Verwendung von Menüs veranschaulicht.

menüelemente Owner-Drawn

Eine Anwendung kann die Darstellung eines Menüelements vollständig mithilfe eines vom Besitzer gezeichneten Elements steuern. Von Besitzern gezeichnete Elemente erfordern, dass eine Anwendung die gesamtverantwortliche Verantwortung für das Zeichnen ausgewählter (hervorgehobener), ausgewählter und gelöschter Zustände übernimmt. Wenn eine Anwendung beispielsweise ein Schriftartenmenü bereitgestellt hat, könnte sie jedes Menüelement mithilfe der entsprechenden Schriftart zeichnen. das Element für Roman würde mit roman gezeichnet, das Element für Kursiv wäre kursiv gezeichnet usw. Weitere Informationen finden Sie unter Erstellen Owner-Drawn Menüelemente.

Das System stellt einen speziellen Typ von Menüelement bereit, das 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 einen Zeilenumbruch an einem bestimmten Element in einer Menüleiste verursachen, indem Sie dem Element das Typflag MFT_MENUBREAK 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 einen Spaltenumbruch für ein bestimmtes Element in einem Menü verursachen, indem Sie dem Element das MFT_MENUBREAK Typflag zuweisen oder die Option MENUBREAK 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 Auswirkung, mit der Ausnahme, dass eine vertikale Linie zwischen der neuen Spalte und der alten spalte angezeigt wird.

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

Nachrichten, die mit Menüs verwendet werden

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 in der Menüleiste auswählt oder mit der rechten Maustaste ein Kontextmenü anzeigt.

Wenn der Benutzer ein Element in der Menüleiste aktiviert, erhält 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-Meldung an die Fensterprozedur, sodass eine Anwendung die Menüs ändern kann, bevor der Benutzer sie sieht. Das System sendet die WM_INITMENU 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 unten in ihren Standard Fenstern 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äht, sendet das System eine WM_COMMAND Nachricht an die Fensterprozedur. Das Wort mit niedriger Reihenfolge 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 einer MENUINFO definiert ist. dwStyle-Wert von MNS_NOTIFYBYPOS, das System sendet WM_MENUCOMMAND anstelle der WM_COMMAND , wenn ein Element ausgewählt wird. Dadurch können Sie auf die Informationen in der MENUINFO-Struktur zugreifen und auch den Index des ausgewählten Elements direkt zur Verfügung stellen.

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 Stelle mit der rechten Maustaste klickt. Solche Anwendungen sollten die WM_CONTEXTMENU-Meldung verarbeiten und ggf. ein Kontextmenü anzeigen. Wenn eine Anwendung kein Kontextmenü anzeigt, sollte sie die WM_CONTEXTMENU Meldung zur Standardverarbeitung an die Funktion DefWindowProc ü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 kontextabhängiges Oder Kontextmenü für ein Menüelement anzeigen können.

Es gibt einige Nachrichten, die nur Drag-and-Drop-Menüs betreffen. Die WM_MENUGETOBJECT wird an den Besitzer eines Drag-and-Drop-Menüs gesendet, wenn der Mauszeiger in ein Menüelement eintritt 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 seine Untermenüs, wodurch das Menühandle und der vom Menü belegte Arbeitsspeicher freigegeben werden. Das System zerstört nicht automatisch ein Menü, das keinem Fenster 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.