2015-10-16 51 views
3

我已經創建了一個與COM窗口的外殼擴展,但我似乎無法正確匹配我添加的項目的ID在IContextMenu::QueryContextMenu與我收到的過載在IContextMenu::InvokeCommand的過載中。在我的代碼中,我使用InsertMenuInsertMenuItem(據我瞭解他們也是這樣做的,但後者有更多的功能?)。不過,我不確定傳遞給InsertMenu/InsertMenuItem的哪些參數對應於我在LPCMINVOKECOMMANDINFO::lpVerb中必須查找的內容。我需要一些方法很容易知道,當我添加項目x,y,z到上下文菜單時,我可以確切地知道哪個x,yz已被點擊。COM IContextMenu :: InvokeCommand - 匹配LPCMINVOKECOMMANDINFO :: lpVerb項

編輯:它看起來動詞等於從當前菜單/子菜單項目的頂部到底部的數字。不過,我有兩個子菜單,每個子菜單的項目數量爲x,因此它們的ID爲1,2,3。我如何設置自定義ID或什麼?

+1

不要求一本手冊,它已被寫入。顯示你的代碼。 –

+0

它寫在哪裏? –

+0

@HansPassant @HansPassant我似乎無法找到解釋這一點的手冊,只有一個在線教程添加了一個動詞,並且您始終知道這是一個動詞 –

回答

0

首先,您應該定義一個枚舉,其中包含菜單項的命令ID,例如

enum { 
    CMDID_FIRST = 0, 

    CMDID_DOSOMETHING = CMDID_FIRST, 
    CMDID_DOSOMETHINGELSE, 

    CMDID_LAST, 
}; 

這些ID值需要從0

開始在IContextMenu::QueryContextMenu實現:

  • 當您添加菜單項,你需要通過設置給他們的每一個ID MIIM_ID標誌位在MENUITEMINFO.fMask字段中,並設置MENUITEMINFO.wID值。

  • 給每一個ID從其命令ID派生的菜單項中的定義如上,其被傳遞到QueryContextMenuidCmdFirst的值。例如。 「做某事」菜單項將有MENUITEMINFO.wID設置爲idCmdFirst + CMDID_DOSOMETHING,並且「做別的事」將有MENUITEMINFO.wID設置爲idCmdFirst + CMDID_DOSOMETHINGELSE

  • QueryContextMenu返回值需要爲MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, x),其中X是添加的最高編號的項目加1的ID(可替代地,如果所有的項目被順序地編號,物品的總數目)。基本上,你告訴主機現在正在使用哪個菜單項ID值,所以沒有其他的菜單擴展項添加與你衝突的項目。在上面的例子中,你會返回MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, CMDID_LAST)

IContextMenu::InvokeCommand

  • 測試如果lpVerb(或lpVerbW)是使用IS_INTRESOURCE宏的整數值。
  • 如果是,則可以在低位字中找到命令ID。例如,如果用戶選擇「做別的事」,你會發現LOWORD(lpVerb) == CMDID_DOSOMETHINGELSE