天天看點

IContextMenu第九部分:添加自定義菜單

我們先具體來看看

IContextMenu::QueryContextMenu裡的幾個參數。其中有三個參數(indexMenu, idCmdFirst和idCmdLast)可以用來控制上下文菜單添加的目标位置。為了示範這個概念,我們會嘗試在我們的上下文菜單中添加兩條自定義的菜單項目,就讓我們稱它們為”Top”和”Bottom”吧。

首先,我們需要為這兩個自定義菜單定義辨別符,如下圖所示:

IContextMenu第九部分:添加自定義菜單

在上面的代碼中,我們修改了SCRATCH_QCM_LAST值以為我們的兩個自定義菜單空出位置,然後我們分别定義了IDM_TOP和IDM_BOTTOM作為自定義菜單的辨別。

通過和之前的代碼進行比較,你就會發現,我們為自定義菜單保留了一段大小為0x1000的空間,同時IContextMenu可以使用剩餘的0x0001到0x6FFF之間的空間作為系統菜單辨別符。

當然,我們也可以通過增加SCRATCH_QCM_FIRST的值,而不是減小SCRATCH_QCM_LAST的值,這是同樣的道理。增加SCRATCH_QCM_FIRST的值是保留低位空間,減小SCRATCH_QCM_LAST的值則是保留高位空間。

下圖是經過修改之後的代碼:

IContextMenu第九部分:添加自定義菜單
IContextMenu第九部分:添加自定義菜單

代碼解析

在我們調用

IContextMenu::QueryContextMenu之前,我們添加了我們的自定義菜單。因為我們在定義辨別符時特意規避了可能存在的辨別符沖突,是以這裡不會有任何意外發生。再次需要注意,這裡調用QueryContextMenu時,我們傳遞了插入位置參數1,而不是0。

當我們傳遞上下文菜單給

IContextMenu::QueryContextMenu時,建立的菜單如下圖所示:

IContextMenu第九部分:添加自定義菜單

由于我們選擇1為插入位置,這就是說,我們要求上下文菜單處理器在位置1處添加它自己的菜單,同時會将目前在位置1上的菜單項依次下推,如下圖所示:

IContextMenu第九部分:添加自定義菜單

當我們點選菜單時,我們這裡做了一次判斷,如果使用者點選的是我們的自定義菜單,則我們直接進行處理,如果點選的是系統的上下文菜單,則我們将點選事件發送給系統處理器進行後續處理。

總結

今天的内容十分具有實戰意義,在需要添加自定義菜單的場景下,特别有用。

最後

最近我寫了個東西

繼續閱讀