Bearbeiten

Share via


Erstellen einer Internet-Explorer-Style Menüleiste

Auf den ersten Blick ähnelt die Menüleiste in Microsoft Internet Explorer 5 und höher einem Standardmenü. Es sieht jedoch ganz anders aus, wenn Sie mit der Verwendung beginnen.

Der folgende Screenshot zeigt die Windows Internet Explorer Menüleiste mit ausgewähltem Menü Extras.

Screenshot der Windows Internet Explorer-Menüleiste mit ausgewähltem Menü

Die Menüleiste ist eigentlich ein Symbolleistensteuerelement, das wie ein Standardmenü aussieht. Anstelle von Menüelementen auf oberster Ebene enthält eine Menüleiste eine Reihe von Nur-Text-Schaltflächen, auf die beim Klicken ein Dropdownmenü angezeigt wird. Als spezialisierter Symbolleistentyp verfügt eine Menüleiste jedoch über einige Funktionen, die Standardmenüs fehlen:

  • Sie kann mithilfe von Standardmäßigen Symbolleistentechniken angepasst werden, sodass Benutzer Elemente verschieben, löschen oder hinzufügen können.
  • Es kann Hot-Tracking haben, sodass Benutzer wissen, wann sie sich über einem Element der obersten Ebene befinden, ohne zuerst darauf klicken zu müssen.

Eine Menüleiste kann in ein Rebar-Steuerelement integriert werden und bietet folgende Funktionen:

  • Es kann über einen Greifer verfügen, der es dem Benutzer ermöglicht, das Band zu verschieben oder die Größe zu ändern.
  • Es kann einen Strip im Rebar-Steuerelement mit anderen Bändern teilen, z. B. der Standardsymbolleiste in der vorherigen Abbildung.
  • Es kann einen Chevron anzeigen, wenn er von einem angrenzenden Band abgedeckt wird, sodass der Benutzer auf die ausgeblendeten Elemente zugreifen kann.
  • Sie kann über eine anwendungsdefinierte Hintergrundbitbitline verfügen.

In diesem Thema wird erläutert, wie Sie eine Menüleiste implementieren. Da eine Menüleiste eine spezielle Implementierung eines Symbolleistensteuerelements ist, liegt der Fokus auf Themen, die für Menüleisten spezifisch sind. Eine Erläuterung zum Integrieren einer Symbolleiste in ein Rebar-Steuerelement finden Sie unter Erstellen einer Internet-Explorer-Style Symbolleiste und Informationen zu Steuerelementen für die Leiste.

Erstellen einer Symbolleiste in eine Menüleiste

So erstellen Sie eine Symbolleiste in eine Menüleiste:

  • Erstellen Sie eine flache Symbolleiste, indem Sie TBSTYLE_FLAT mit den anderen Fensterformatflags einschließen. Der TBSTYLE_FLAT-Stil ermöglicht auch hot-tracking. Bei diesem Stil ähnelt die Menüleiste einem Standardmenü, bis der Benutzer eine Schaltfläche aktiviert. Dann scheint sich die Schaltfläche von der Symbolleiste abzuheben und zu drücken, wenn sie geklickt wird, genau wie eine Standardschaltfläche. Da die Hot-Tracking-Funktion aktiviert ist, muss der Cursor nur mit dem Mauszeiger darauf zeigen, um eine Schaltfläche zu aktivieren. Wenn der Cursor zu einer anderen Schaltfläche bewegt wird, wird er aktiviert und die alte Schaltfläche deaktiviert.
  • Erstellen Sie Schaltflächen im Listenformat, indem Sie TBSTYLE_LIST mit den anderen Fensterformatflags einschließen. Dieser Stil erstellt eine dünnere Schaltfläche, die eher einem Standardmenüelement der obersten Ebene ähnelt.
  • Stellen Sie die Schaltflächen nur textfrei fest, indem Sie das iBitmap-Element der TBBUTTON-Struktur der Schaltfläche auf I_IMAGENONE und den iString-Member auf den Schaltflächentext festlegen.
  • Weisen Sie jeder Schaltfläche den BTNS_DROPDOWN Stil zu. Wenn auf die Schaltfläche geklickt wird, sendet das Symbolleistensteuerelement Ihrer Anwendung eine TBN_DROPDOWN Benachrichtigung, um sie aufzufordern, das Menü der Schaltfläche anzuzeigen.
  • Integrieren Sie die Menüleiste in ein Beleistenband. Aktivieren Sie sowohl Greifer als auch Chevrons, wie unter Erstellen eines Internets Explorer-Style Symbolleiste erläutert.
  • Implementieren Sie einen TBN_DROPDOWN-Handler , um das Dropdownmenü der Schaltfläche anzuzeigen, wenn darauf geklickt wird. Das Dropdownmenü ist eine Art Popupmenü. Es wird mithilfe der Funktion TrackPopupMenu erstellt, wobei die obere linke Ecke an der unteren linken Ecke der Schaltfläche ausgerichtet ist.
  • Implementieren Sie die Tastaturnavigation, sodass die Menüleiste ohne Maus vollständig zugänglich ist.
  • Implementieren sie die Hottracking-Menüs. Wenn bei Standardmenüs das Menü eines Menüelements der obersten Ebene angezeigt wurde, wird der Cursor über ein anderes Element der obersten Ebene automatisch angezeigt, und das Menü des vorherigen Elements wird reduziert. Das Symbolleistensteuerelement verfolgt den Cursor heiß nach und ändert das Schaltflächenbild, zeigt jedoch automatisch das neue Menü an. Ihre Anwendung muss dies explizit tun.

Die meisten dieser Elemente sind einfach zu implementieren und werden an anderer Stelle diskutiert. Unter Erstellen einer Internet-Explorer-Style Symbolleiste, Informationen zu Symbolleistensteuerelementen oder Über Steuerelemente für die Beleiste finden Sie eine allgemeine Erläuterung zur Verwendung von Symbolleisten und Steuerelementen für die Leiste. Informationen zum Umgang mit Popupmenüs finden Sie unter Menüs . Die letzten beiden Elemente, Tastaturnavigation und Menü-Hot-Tracking, werden im weiteren Verlauf dieses Themas erläutert.

Behandeln der Navigation mit deaktiviertem Menü Hot-Tracking

Benutzer können die Menüleiste mit der Maus, der Tastatur oder einer Mischung aus beidem navigieren. Zum Implementieren der Menüleistennavigation muss Ihre Anwendung Symbolleistenbenachrichtigungen verarbeiten und Maus und Tastatur überwachen. Diese Aufgabe kann in zwei verschiedene Teile unterteilt werden: mit und ohne Menü-Hot-Tracking. In diesem Abschnitt wird erläutert, wie die Navigation behandelt wird, wenn keine Menüs angezeigt werden und die Menüüberwachung nicht aktiviert ist.

Mausnavigation

Wenn das Menü hot-tracking deaktiviert ist, können Sie eine Menüleiste als normale Symbolleiste behandeln. Wenn der Benutzer mit der Maus navigiert, muss Ihre Anwendung lediglich die TBN_DROPDOWN Benachrichtigung verarbeiten. Wenn diese Benachrichtigung empfangen wird, zeigen Sie das entsprechende Dropdownmenü an, und aktivieren Sie das Menü hot-tracking. Von nun an befinden Sie sich im Menü hot-tracking-Regime, das unter Handling Navigation with Menu Hot-Tracking Enabled beschrieben wird.

Wie unter Gemischte Navigation erläutert, müssen Sie auch die TBN_HOTITEMCHANGE Benachrichtigung verarbeiten, um die aktive Schaltfläche nachzuverfolgen. Diese Benachrichtigung ist irrelevant, wenn der Benutzer nur mit der Maus navigiert, aber es ist erforderlich, wenn Maus- und Tastaturnavigation gemischt werden.

Tastaturnavigation

Wie im vorherigen Abschnitt erwähnt, kann der Benutzer eine Reihe von Navigationsvorgängen mit der Tastatur ausführen, wenn das Menü hot-tracking deaktiviert ist. Symbolleistensteuerelemente unterstützen die Tastaturnavigation nur, wenn sie den Fokus haben. Sie verarbeiten auch nicht alle Tastendrücke, die für Menüleisten benötigt werden. Die einfachste Lösung für die Verarbeitung der Tastaturnavigation besteht darin, die relevanten Tastendruckereignisse explizit zu verarbeiten.

Wenn das Menü hot-tracking deaktiviert ist, muss Ihre Anwendung diese Tastendruckereignisse wie folgt behandeln:

  • F10-TASTE Aktivieren Sie die erste Schaltfläche mit TB_SETHOTITEM.
  • Die NACH-LINKS- und NACH-RECHTS-TASTE. Aktivieren Sie die angrenzende Schaltfläche mit TB_SETHOTITEM. Wenn der Benutzer versucht, von beiden Enden der Menüleiste zu navigieren, aktivieren Sie die erste Schaltfläche am anderen Ende.
  • Die ESCAPE-Taste. Deaktivieren Sie die aktive Schaltfläche mit TB_SETHOTITEM. Die Menüleiste sollte in den Zustand zurückgeführt werden, den sie vor der Aktivierung der ersten Schaltfläche hatte.
  • Eine ALT-Tastenkombination . Verwenden Sie die TB_MAPACCELERATOR Nachricht, um zu bestimmen, welcher Schaltfläche das Schlüsselzeichen entspricht. Zeigen Sie das Dropdownmenü der Schaltfläche an, und aktivieren Sie das Menü hot-tracking.
  • NACH-UNTEN-TASTE Wenn eine Schaltfläche aktiv ist, aber kein Menü angezeigt wurde, zeigen Sie das Menü der Schaltfläche an, und aktivieren Sie die Menüüberwachung.
  • EINGABETASTE Deaktivieren Sie die aktive Schaltfläche mit TB_SETHOTITEM. Die Menüleiste sollte in den Zustand zurückgeführt werden, den sie vor der Aktivierung der ersten Schaltfläche hatte.

Gemischte Navigation

Die im vorherigen Abschnitt beschriebenen Tastaturnavigationshandler erledigen im Wesentlichen zwei Aufgaben: Verfolgen Sie die aktive Schaltfläche und zeigen das entsprechende Menü an, wenn eine Schaltfläche ausgewählt ist. Diese Handler sind ausreichend, solange der Benutzer nur mit der Tastatur navigiert. Benutzer kombinieren jedoch häufig Tastatur- und Mausnavigation. Beispielsweise können sie die erste Schaltfläche mit der F10-Taste aktivieren, eine andere Schaltfläche mit der Maus aktivieren und dann ihr Menü mit der NACH-UNTEN-TASTE öffnen. Wenn Sie nur die Tastendrücke überwachen, um die aktive Taste nachzuverfolgen, wird das falsche Menü angezeigt. Sie müssen auch die TBN_HOTITEMCHANGE Benachrichtigung verarbeiten, um die aktive Schaltfläche genau nachzuverfolgen.

Behandeln der Navigation mit aktiviertem Menü Hot-Tracking

Wenn das Menü hot-tracking aktiviert ist, muss Ihre Anwendung die Art und Weise ändern, wie sie auf die Benutzernavigation reagiert. Um das Verhalten von Standardmenüs zu replizieren, müssen Sie die folgenden Features explizit implementieren.

Mit Mausnavigation:

  • Wenn der Benutzer den Cursor über eine andere Schaltfläche bewegt, wird dieses Menü sofort angezeigt, und das vorherige Menü wird ausgeblendet.
  • Das Menü hot-tracking bleibt aktiv, bis der Benutzer einen Befehl auswählt oder auf einen Punkt klickt, der nicht Teil des Menübereichs ist. Bei beiden Aktionen wird die Hot-Tracking-Funktion des Menüs deaktiviert, bis auf eine andere Schaltfläche geklickt wird.
  • Wenn sich der Cursor aus dem Menü bewegt, bleibt das aktuelle Dropdownmenü bestehen, bis sich der Cursor wieder zurück bewegt, oder der Benutzer klickt auf einen Punkt außerhalb des bereichs, der vom Menü abgedeckt wird. Wenn der Cursor auf eine andere Schaltfläche als die aktuell angezeigte zurück kehrt, wird das alte Menü reduziert, und das neue Menü wird angezeigt.

Mit Tastaturnavigation:

  • Die NACH-RECHTS-TASTE verschiebt den Fokus nach rechts. Wenn das Element über ein Untermenü verfügt, zeigen Sie das Untermenü an. Wenn das Element kein Untermenü hat, reduzieren Sie das Menü und alle Untermenüs, aktivieren Sie die nächste Schaltfläche mit TB_SETHOTITEM, und zeigen Sie das Menü für die angrenzende Schaltfläche an. Wenn die letzte Schaltfläche aktiv ist, wenn diese Nachricht empfangen wird, zeigen Sie das Menü für die erste Schaltfläche an.

  • Die NACH-LINKS-TASTE verschiebt den Fokus nach links. Wenn es sich bei dem Element um ein Untermenü handelt, reduzieren Sie es, und verschieben Sie den Fokus auf das übergeordnete Menü. Wenn das Element kein Untermenü ist, reduzieren Sie das Menü, aktivieren Sie die nächste Schaltfläche mit TB_SETHOTITEM, und zeigen Sie das Menü für diese Schaltfläche an.

  • Die ESCAPE-Taste sichert die Anzeige um einen Schritt.

    • Wenn ein Untermenü angezeigt wird, wird es reduziert und der Fokus wird auf das übergeordnete Menü verschoben.
    • Wenn das Menü einer Schaltfläche angezeigt wird, wird es reduziert, und die Menüüberwachung ist deaktiviert. Die Schaltfläche des Elements bleibt aktiv.
    • Wenn keine Menüs angezeigt werden, aber eine Schaltfläche aktiv ist, wird die Schaltfläche deaktiviert, und die Menüüberwachung ist deaktiviert.
  • Die NACH-OBEN- und NACH-UNTEN-TASTE werden nur verwendet, um in einem bestimmten Menü zu navigieren.

  • Die EINGABETASTE startet den Befehl, der einem Menüelement zugeordnet ist. Wenn das Menüelement über ein Untermenü verfügt, wird es mit der EINGABETASTE angezeigt.

Wie bei der deaktivierten Menü-Hot-Tracking-Hülle muss Ihre Anwendung in der Lage sein, maus-, tastatur- und gemischte Navigation zu verarbeiten. Die Tatsache, dass ein Menü angezeigt wird, bedeutet jedoch, dass Messaging etwas anders behandelt werden muss.

Nachrichtenverarbeitung für menübasierte Hot-Tracking

Die Menü-Hot-Tracking erfordert, dass ein Menü jederzeit angezeigt wird, abgesehen von dem kurzen Intervall, das zum Wechseln zu einem neuen Menü erforderlich ist. Das Dropdownmenü, das von TrackPopupMenu angezeigt wird, ist jedoch modal. Ihre Anwendung empfängt weiterhin einige Nachrichten direkt, z. B. WM_COMMAND, TBN_HOTITEMCHANGE und normale Menünachrichten, z. B. WM_MENUSELECT. Es empfängt jedoch keine Tastatur- oder Mausnachrichten auf niedriger Ebene direkt. Um Nachrichten wie WM_MOUSEMOVE zu verarbeiten, müssen Sie einen Nachrichtenhaken zum Abfangen von Nachrichten festlegen, die an das Menü weitergeleitet werden.

Wenn ein Dropdownmenü angezeigt wird, legen Sie den Nachrichtenhaken fest, indem Sie die SetWindowsHookEx-Funktion aufrufen, wobei der idHook-Parameter auf WH_MSGFILTER festgelegt ist. Alle für das Menü vorgesehenen Nachrichten werden an Ihre MessageProc übergeben. Das folgende Codefragment legt beispielsweise einen Nachrichtenhaken fest, mit dem Nachrichten erfasst werden, die in ein Dropdownmenü gelangen. MsgHook ist der Name der Hookprozedur und hhookMsg das Handle für die Prozedur.

hhookMsg = SetWindowsHookEx(WH_MSGFILTER, MsgHook, HINST_THISDLL, 0);

Menümeldungen werden identifiziert, indem der nCode-Parameter der Hookprozedur auf MSGF_MENU festgelegt wird. Der lParam-Parameter zeigt auf eine MSG-Struktur mit der Nachricht. Die Details, welche Nachrichten wie behandelt werden müssen, werden im weiteren Verlauf dieses Themas erläutert.

Ihre Anwendung muss alle Nachrichten an den nächsten Nachrichtenhaken übergeben, indem sie die CallNextHookEx-Funktion aufruft . Außerdem müssen Sie Mausnachrichten direkt an das Symbolleistensteuerelement senden und dabei alle Punktkoordinaten in den Clientkoordinatenraum der Symbolleiste konvertieren. Durch das direkte Senden der Nachrichten wird sichergestellt, dass das Symbolleistensteuerelement die entsprechenden Mausnachrichten empfängt. Für instance muss die Symbolleiste WM_MOUSEMOVE Nachrichten empfangen, um die Schaltflächen hot-tracken zu können.

Wenn eine neue Schaltfläche aktiviert wird, muss Ihre Anwendung das alte Dropdownmenü mit einer WM_CANCELMODE Nachricht reduzieren und ein neues Menü anzeigen. Außerdem muss das Dropdownmenü reduziert werden, wenn der Fokus von der Menüleiste mit Tastaturnavigation oder durch Klicken außerhalb des Menübereichs genommen wird. Wenn Sie ein Menü reduzieren, sollten Sie dessen Nachrichtenhaken mithilfe der UnhookWindowsHookEx-Funktion freigeben. Wenn Sie ein weiteres Dropdownmenü anzeigen müssen, erstellen Sie einen neuen Nachrichtenhaken. Wenn ein Befehl gestartet wird, wird das Menü automatisch reduziert, aber Sie müssen den Nachrichtenhaken explizit freigeben.

Im folgenden Codebeispiel wird der Nachrichtenhaken freigegeben, der im vorherigen Beispiel festgelegt wurde.

UnhookWindowsHookEx(hhookMsg);

Mausnavigation

Wenn ein normales Symbolleistensteuerelement Schaltflächen hot-trackt, hebt es die aktive Schaltfläche hervor und sendet der Anwendung jedes Mal, wenn eine neue Schaltfläche aktiviert wird, eine TBN_HOTITEMCHANGE Benachrichtigung. Ihre Anwendung ist für die Anzeige des entsprechenden Dropdownmenüs verantwortlich. Sie muss:

  • Behandeln Sie die TBN_HOTITEMCHANGE Benachrichtigung, um die aktive Schaltfläche nachzuverfolgen. Wenn sich die aktive Schaltfläche ändert, reduzieren Sie das alte Menü, und erstellen Sie ein neues Menü.
  • Behandeln Sie die TBN_DROPDOWN Benachrichtigung, die beim Klicken auf eine Schaltfläche gesendet wird. Anschließend sollte das Menü reduziert und die Hot-Tracking-Funktion des Menüs deaktiviert werden. Die Schaltfläche bleibt aktiv.
  • Behandeln Sie die WM_LBUTTONDOWN, WM_RBUTTONDOWN und WM_MOUSEMOVE Nachrichten in Ihrer Nachrichtenhakenprozedur, um die Mausposition nachzuverfolgen. Wenn die Maus außerhalb des Menübereichs geklickt wird, reduzieren Sie das aktuelle Dropdownmenü, deaktivieren Sie die Menüüberwachung, und kehren Sie die Menüleiste in den Voraktivierungszustand zurück.
  • Wenn ein Menübefehl gestartet wird, deaktivieren Sie das Menü hot-tracking. Das Menü wird automatisch reduziert, aber Sie müssen den Nachrichtenhaken explizit freigeben.

Sie müssen auch menübezogenes Messaging verarbeiten, z. B. die WM_INITMENUPOPUP Nachricht, die gesendet wird, wenn ein Menüelement ein Untermenü anzeigen muss. Eine Erläuterung zum Umgang mit solchen Nachrichten finden Sie unter Menüs.

Tastaturnavigation

Ihre Anwendung muss Tastaturnachrichten in der Meldungshakenprozedur verarbeiten und auf diejenigen reagieren, die sich auf die Hot-Tracking-Menüs auswirken. Die folgenden Tastendrucke müssen verarbeitet werden:

  • Die ESCAPE-Taste. Die ESCAPE-Taste sichert die Anzeige um eine Ebene. Wenn ein Untermenü angezeigt wird, muss es reduziert werden. Wenn das primäre Menü einer Schaltfläche angezeigt wird, reduzieren Sie es, und deaktivieren Sie das Menü hot-tracking. Die Schaltfläche bleibt aktiv.
  • NACH-RECHTS-TASTE Wenn das Element über ein Untermenü verfügt, zeigen Sie es an. Wenn das Element kein Untermenü hat, reduzieren Sie das Menü und alle Untermenüs, aktivieren Sie die nächste Schaltfläche mit TB_SETHOTITEM, und zeigen Sie ihr Menü an. Wenn die letzte Schaltfläche aktiv war, als diese Benachrichtigung empfangen wurde, zeigen Sie das Menü für die erste Schaltfläche an.
  • NACH-LINKS-TASTE Wenn sich das Element in einem Untermenü befindet, reduzieren Sie es, und verschieben Sie den Fokus auf das übergeordnete Menü. Wenn das Element kein Untermenü ist, reduzieren Sie das Menü, aktivieren Sie die angrenzende Schaltfläche mit TB_SETHOTITEM, und zeigen Sie ihr Menü an. Wenn die erste Schaltfläche beim Empfang dieser Benachrichtigung aktiv war, zeigen Sie das Menü für die letzte Schaltfläche an.
  • Die NACH-OBEN- und NACH-UNTEN-TASTE. Diese Tasten werden verwendet, um innerhalb eines Menüs zu navigieren, wirken sich aber nicht direkt auf die Hot-Tracking-Menüs aus.
  • Eine ALT-Tastenkombination . Verwenden Sie die TB_MAPACCELERATOR Nachricht, um zu bestimmen, welcher Schaltfläche das Schlüsselzeichen entspricht. Wenn es einer anderen Schaltfläche als der aktuell aktiven entspricht, reduzieren Sie das aktuelle Dropdownmenü, aktivieren Sie die neue Schaltfläche mit TB_SETHOTITEM, und zeigen Sie das Menü für die angrenzende Schaltfläche an. Wenn das Schlüsselzeichen der aktuell angezeigten Schaltfläche entspricht, reduzieren Sie das Dropdownmenü, und deaktivieren Sie das Menü hot-tracking. Die Schaltfläche sollte aktiv bleiben.