Teilen über


Verschachteln des Hilfemenüs

Wenn ein Objekt in einem Container aktiv ist, erhält das Menüzusammenführungsprotokoll von OLE-Dokumenten das vollständige Steuerelement des Hilfemenüs . Daher sind die Hilfethemen des Containers nicht verfügbar, es sei denn, der Benutzer deaktiviert das Objekt. Die Architektur der aktiven Dokumenteindämmung erweitert die Regeln für das Zusammenführen von direkten Menüs, um sowohl den Container als auch ein aktives Dokument zum Freigeben des Menüs zu ermöglichen. Die neuen Regeln sind lediglich zusätzliche Konventionen darüber, welche Komponente dem Teil des Menüs gehört und wie das freigegebene Menü erstellt wird.

Die neue Konvention ist einfach. In aktiven Dokumenten verfügt das Hilfemenü über zwei Menüelemente auf oberster Ebene wie folgt:

Help

Container Help >

Object Help >

Wenn beispielsweise ein Word-Abschnitt im Office-Ordner aktiv ist, wird das Hilfemenü wie folgt angezeigt:

Help

Binder Help >

Word Help >

Beide Menüelemente sind kaskadierende Menüs, unter denen alle zusätzlichen Menüelemente, die für den Container spezifisch sind, und das Objekt dem Benutzer bereitgestellt werden. Die hier angezeigten Elemente variieren je nach Container und Objekten.

Um dieses zusammengeführte Hilfemenü zu erstellen, ändert die architektur des aktiven Dokuments die normale OLE-Dokumentdokumente-Prozedur. Gemäß OLE-Dokumenten kann die zusammengeführte Menüleiste sechs Menügruppen aufweisen, nämlich "Datei", "Bearbeiten", "Container", "Objekt", "Fenster", "Hilfe" in dieser Reihenfolge. In jeder Gruppe kann es null oder mehr Menüs geben. Die Gruppen "Datei", "Container" und "Fenster" gehören zum Container, und die Gruppen "Bearbeiten", "Objekt" und "Hilfe" gehören zum Objekt. Wenn das Objekt das Zusammenführen von Menüs durchführen möchte, wird eine leere Menüleiste erstellt und an den Container übergeben. Der Container fügt dann seine Menüs durch Aufrufen ein IOleInPlaceFrame::InsertMenus. Das Objekt übergibt auch eine Struktur, die ein Array von sechs LONG-Werten (OLEMENUGROUPWIDTHS) ist. Nach dem Einfügen der Menüs markiert der Container die Anzahl der Menüs, die er in jeder seiner Gruppen hinzugefügt hat, und gibt dann zurück. Anschließend fügt das Objekt seine Menüs ein, wobei die Anzahl der Menüs in jeder Containergruppe beachtet wird. Schließlich übergibt das Objekt die zusammengeführte Menüleiste und das Array (das die Anzahl der Menüs in jeder Gruppe enthält) an OLE, wodurch ein undurchsichtiger "Menüdeskriptor" -Handle zurückgegeben wird. Später übergibt das Objekt das Handle und die zusammengeführte Menüleiste an den Container.IOleInPlaceFrame::SetMenu Zu diesem Zeitpunkt zeigt der Container die zusammengeführte Menüleiste an und übergibt auch das Handle an OLE, sodass OLE die ordnungsgemäße Verteilerung von Menümeldungen ausführen kann.

In der geänderten aktiven Dokumentprozedur muss das Objekt zuerst die OLEMENUGROUPWIDTHS-Elemente auf Null initialisieren, bevor es an den Container übergeben wird. Anschließend führt der Container eine normale Menüeinfügung mit einer Ausnahme aus: Der Container fügt ein Hilfemenü als letztes Element ein und speichert einen Wert von 1 im letzten (sechsten) Eintrag des OLEMENUGROUPWIDTHS-Arrays (d. h. width[5], das zur Hilfegruppe des Objekts gehört). Dieses Hilfemenü enthält nur ein Element, das ein Untermenü ist, das "Containerhilfe>"-Kaskadenmenü wie zuvor beschrieben.

Das Objekt führt dann den normalen Menüeinfügecode aus, außer dass vor dem Einfügen des Hilfemenüs der sechste Eintrag des OLEMENUGROUPWIDTHS-Arrays überprüft wird. Wenn der Wert "1" und der Name des letzten Menüs "Hilfe" (oder die entsprechende lokalisierte Zeichenfolge) lautet, fügt das Objekt das Hilfemenü als Untermenü des Hilfemenüs des Containers ein.

Das Objekt legt dann das sechste Element von OLEMENUGROUPWIDTHS auf Null fest und erhöht das fünfte Element um eins. Dadurch wird OLE informiert, dass das Hilfemenü zum Container gehört, und die Menümeldungen, die diesem Menü (und seinen Untermenüs) entsprechen, an den Container weitergeleitet werden sollten. Anschließend liegt die Verantwortung des Containers darin, WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND und andere menübezogene Nachrichten weiterzuleiten, die zum Teil des Hilfemenüs des Objekts gehören. Dazu wird WM_INITMENU verwendet, um ein Flag zu löschen, das dem Container angibt, ob der Benutzer im Hilfemenü des Objekts navigiert hat. Der Container überwacht dann WM_MENUSELECT , um ein Element im Hilfemenü ein- oder aus dem Menü "Hilfe " einzugeben oder zu verlassen, das der Container nicht selbst hinzugefügt hat. Bei der Eingabe bedeutet dies, dass der Benutzer in ein Objektmenü navigiert hat, sodass der Container das Flag "Im Objekthilfemenü" festlegt und den Status dieser Kennzeichnung verwendet, um alle WM_MENUSELECT, WM_INITMENUPOPUP und WM_COMMAND Nachrichten als Minimum an das Objektfenster weiterzuleiten. (Beim Beenden löscht der Container das Flag und verarbeitet dann dieselben Nachrichten selbst.) Der Container sollte das von der Objektfunktion IOleInPlaceActiveObejct::GetWindow zurückgegebene Fenster als Ziel für diese Nachrichten verwenden.

Wenn das Objekt im sechsten Element von OLEMENUGROUPWIDTHS eine Null erkennt, wird es gemäß den normalen OLE Documents-Regeln fortgesetzt. Dieses Verfahren behandelt Container, die an der Zusammenführung des Hilfemenüs teilnehmen, sowie solche, die nicht.

Wenn das Objekt aufgerufen wird IOleInPlaceFrame::SetMenu, überprüft der Container vor dem Anzeigen der zusammengeführten Menüleiste, ob das Hilfemenü zusätzlich zu dem, was der Container eingefügt hat, über ein zusätzliches Untermenü verfügt. Wenn ja, verlässt der Container sein Hilfemenü in der zusammengeführten Menüleiste. Wenn das Hilfemenü nicht über ein zusätzliches Untermenü verfügt, entfernt der Container sein Hilfemenü aus der zusammengeführten Menüleiste. Dieses Verfahren behandelt Objekte, die am Zusammenführen des Hilfemenüs teilnehmen, sowie solche, die dies nicht tun.

Wenn es an der Zeit ist, das Menü zu zerlegen, entfernt das Objekt das eingefügte Hilfemenü zusätzlich zum Entfernen der anderen eingefügten Menüs. Wenn der Container seine Menüs entfernt, wird das Hilfemenü zusätzlich zu den anderen eingefügten Menüs entfernt.

Siehe auch

Aktive Dokumente-Container