Dela via


Sammanslagning av hjälpmeny

När ett objekt är aktivt i en container ger menysammanslagningens protokoll för OLE-dokument objektet fullständig kontroll över hjälpmenyn . Därför är containerns hjälpavsnitt inte tillgängliga om inte användaren inaktiverar objektet. Den aktiva dokument-inneslutningsarkitekturen utökar reglerna för meny-sammanslagning direkt så att både containern och ett aktivt dokument kan dela menyn. De nya reglerna är helt enkelt ytterligare konventioner om vilken komponent som äger vilken del av menyn och hur den delade menyn är konstruerad.

Den nya konventionen är enkel. I aktiva dokument har hjälpmenyn två menyalternativ på den översta nivån ordnade på följande sätt:

Help

Container Help >

Object Help >

När ett Word-avsnitt till exempel är aktivt i Office Binder visas hjälpmenyn på följande sätt:

Help

Binder Help >

Word Help >

Båda menyalternativen är sammanhängande menyer där eventuella ytterligare menyalternativ som är specifika för containern och objektet tillhandahålls till användaren. Vilka objekt som visas här varierar beroende på vilken container och vilka objekt som ingår.

För att konstruera denna sammanfogade Hjälp-meny ändrar dokumentinnehållsarkitekturen den normala OLE-dokumentproceduren. Enligt OLE-dokument kan den sammanfogade menyraden ha sex grupper med menyer, nämligen Arkiv, Redigera, Container, Objekt, Fönster, Hjälp, i den ordningen. I varje grupp kan det finnas noll eller fler menyer. Grupperna Fil, Container och Fönster tillhör containern och grupperna Redigera, Objekt och Hjälp tillhör objektet. När objektet vill sammanfoga menyn skapas en tom menyrad och skickas till containern. Containern infogar sedan sina menyer genom att anropa IOleInPlaceFrame::InsertMenus. Objektet skickar också en struktur som är en matris med sex LONG-värden (OLEMENUGROUPWIDTHS). När du har infogat menyerna markerar containern hur många menyer den har lagt till i var och en av dess grupper och returnerar sedan. Sedan infogar objektet sina menyer och uppmärksammar antalet menyer i varje containergrupp. Slutligen skickar objektet den sammanfogade menyraden och matrisen (som innehåller antalet menyer i varje grupp) till OLE, vilket returnerar en ogenomskinlig "menybeskrivningsreferens". Senare skickar objektet det handtaget och den sammanfogade menyraden till containern via IOleInPlaceFrame::SetMenu. För närvarande visar containern den sammanfogade menyraden och skickar även handtaget till OLE, så att OLE kan skicka menymeddelanden korrekt.

I den ändrade aktiva dokumentproceduren måste objektet först initiera OLEMENUGROUPWIDTHS-elementen till noll innan det skickas till containern. Sedan utför containern en normal menyinfogning med ett undantag: Containern infogar en hjälpmeny som det sista objektet och lagrar värdet 1 i den sista (sjätte) posten i OLEMENUGROUPWIDTHS-matrisen (det vill: width[5], som tillhör objektets hjälpgrupp). Den här hjälpmenyn har bara ett objekt som är en undermeny, kaskadmenyn "Container Help>" enligt beskrivningen ovan.

Objektet kör sedan sin normala menyinfogningskod, förutom att det kontrollerar den sjätte posten i matrisen OLEMENUGROUPWIDTHS innan den infogas i hjälpmenyn. Om värdet är 1 och namnet på den sista menyn är Hjälp (eller lämplig lokaliserad sträng) infogar objektet sin hjälpmeny som undermeny i containerns hjälpmeny .

Objektet anger sedan det sjätte elementet i OLEMENUGROUPWIDTHS till noll och ökar det femte elementet med ett. Detta meddelar OLE att hjälpmenyn tillhör containern och att menymeddelandena som motsvarar den menyn (och dess undermenyer) ska dirigeras till containern. Det är sedan containerns ansvar att vidarebefordra WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND och andra menyrelaterade meddelanden som tillhör objektets del av hjälpmenyn . Detta görs med hjälp av WM_INITMENU för att rensa en flagga som talar om för containern om användaren har navigerat till objektets hjälpmeny . Containern bevakar sedan WM_MENUSELECT för in- eller utmatning från ett objekt på hjälpmenyn som containern inte lade till sig själv. Vid inmatning innebär det att användaren har navigerat till en objektmeny, så containern sätter flaggan "i hjälpmenyn för objekt" och använder flaggans tillstånd för att vidarebefordra WM_MENUSELECT, WM_INITMENUPOPUP, och WM_COMMAND meddelanden, som minst, till objektfönstret. (Vid avslut rensar containern flaggan och bearbetar sedan samma meddelanden själv.) Containern bör använda fönstret som returneras från objektets IOleInPlaceActiveObejct::GetWindow funktion som mål för dessa meddelanden.

Om objektet identifierar en nolla i det sjätte elementet i OLEMENUGROUPWIDTHS fortsätter det enligt de normala OLE-dokumentreglerna. Den här proceduren omfattar containrar som deltar i hjälpmenyns sammanslagning samt de som inte gör det.

När objektet anropar IOleInPlaceFrame::SetMenu, innan den sammanfogade menyraden visas, kontrollerar containern om hjälpmenyn har ytterligare en undermeny, utöver vad containern har infogat. I så fall lämnar containern hjälpmenyn i den sammanfogade menyraden. Om hjälpmenyn inte har ytterligare en undermeny tar containern bort hjälpmenyn från den sammanfogade menyraden. Den här proceduren omfattar objekt som deltar i hjälpmenyns sammanslagning samt de som inte gör det.

Slutligen, när det är dags att demontera menyn, tar objektet bort den infogade hjälpmenyn förutom att ta bort de andra infogade menyerna. När containern tar bort sina menyer tas menyn Hjälp bort utöver de andra menyer som den har infogat.

Se även

Aktiva dokumentcontainrar