說明功能表合併
功能表合併通訊協定的 OLE 文件容器內作用中的物件時,提供物件的完整控制幫助功能表。如此一來,容器的 [說明] 主題沒有可用除非使用者停用物件。使用中文件的內含項目架構為基礎進行就地功能表合併成同時允許容器和主動式文件正在使用共用] 功能表中的規則來延伸。新的規則是關於哪個元件擁有功能表的哪個部分和共用的功能表如何建構的只是新增慣例。
此新慣例很簡單。在使用中的文件、 幫助功能表則有兩個最上層功能表項目,組織,如下所示:
Help
Container Help >
Object Help >
比方說,當 Word 區段才有作用 Office 文件夾中,然後在幫助功能表會出現,如下所示:
Help
Binder Help >
Word Help >
這兩個功能表項目是特定容器和物件的任何其他功能表項目會提供給使用者的階層式功能表。什麼項目出現在這裡會隨著容器與物件相關。
若要建構合併這幫助 ] 功能表中,使用中文件的內含項目架構修改標準的 OLE 文件程序。根據 OLE 文件,來合併的功能表列可以有六個群組內的功能表,也就是檔案, 編輯, 容器, Object, 視窗, 幫助、 在該順序。在每個群組中,可以有零個或多個功能表。群組檔案, 容器,以及 視窗 屬於容器和群組 編輯, 物件, 和幫助隸屬於該物件。當物件要做功能表合併時,它會建立空白的功能表列,並將其傳遞至容器。容器然後插入其功能表,藉由呼叫 IOleInPlaceFrame::InsertMenus。物件也會傳遞結構,這六個長值的陣列 (OLEMENUGROUPWIDTHS)。插入後的功能表,容器標明它在其群組,然後傳回的每個圖案中加入多少個功能表。接著物件插入其功能表,注意每個容器群組裡功能表數目。最後,物件會在合併的功能表列和陣列 (其中包含每個群組中的功能表數目) 傳遞給 OLE,會傳回不透明 「 功能表描述項"處理。稍後物件傳遞該控點而且合併的功能表列至容器中,透過 IOleInPlaceFrame::SetMenu。此時,容器顯示合併的功能表列,並也會控制代碼傳遞給 OLE,,所以 OLE 可以做適當的功能表訊息分派。
在修改使用中文件的程序中,物件必須先將初始化 OLEMENUGROUPWIDTHS 設為零,然後再將它傳遞至容器的項目。接著容器執行一般的功能表插入有一個例外: 容器插入幫助 做為最後一個項目] 功能表,並將值 1 儲存在最後一個 (第六段) 項目時的 OLEMENUGROUPWIDTHS 陣列 (也就是 width [5],它屬於物件的說明群組)。這幫助 功能表將會有一個項目,也就是子功能表,而"容器說明 > 」 如前面敘述地重疊功能表。
物件接著就執行之外,再插入其一般功能表插入程式碼其幫助 它會檢查的第六個項目] 功能表中, OLEMENUGROUPWIDTHS 陣列。如果值是 1 而且最後功能表的名稱是幫助 (或適當的當地語系化字串),接著物件插入其 幫助 做為容器的子功能表的功能表 幫助功能表。
物件,然後設定的第六個項目 OLEMENUGROUPWIDTHS 設為零和累加人數的第五個項目。這讓 OLE 知道, 幫助功能表屬於容器,而對應於該功能表 (和它的子功能表) 的功能表訊息應該傳送到容器。然後是容器的責任轉送給WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND,以及其他功能表相關的訊息物件的部分屬於幫助功能表。這是藉由使用WM_INITMENU以取消選取 [旗標,指出容器是否使用者巡覽至物件的幫助功能表。然後會檢查容器WM_MENUSELECT進入或離開任一項目上幫助容器並未將其本身的功能表。在進入時,就表示使用者巡覽至 [物件] 功能表中,因此容器設定"中物件的說明] 功能表"旗標,並使用該旗標的狀態轉送給任何WM_MENUSELECT, WM_INITMENUPOPUP,以及 WM_COMMAND 至少至 [物件] 視窗的訊息。(上結束時,容器清除旗標,然後自行處理這些相同的訊息。應該使用傳回的物件的視窗] 容器 IOleInPlaceActiveObejct::GetWindow 做為這些訊息的目的地。
如果該物件會偵測到的第六個項目中的零, OLEMENUGROUPWIDTHS,並在進行一般 OLE 文件規則。這個程序涵蓋參與容器幫助 ,以及未合併的功能表。
當物件呼叫 IOleInPlaceFrame::SetMenu、 是否顯示合併的功能表列,以及容器檢查之前 幫助功能表則有其他的子功能表,除了已插入的容器。因此,容器沒有其幫助合併的功能表列的功能表中。如果幫助 功能表沒有其他的子功能表,容器將會移除其 幫助從合併的功能表列的功能表。這個程序涵蓋參與的物件幫助 ,以及未合併的功能表。
最後,等到来分解功能表時,物件會移除插入幫助除了移除其他的功能表插入功能表。當容器移除它的功能表時,將會移除其幫助除了其他已經插入的功能表的功能表。