天天看點

IContextMenu第八部分:預設菜單的優化

在上一篇文章的結尾,我們提到對于預設菜單的調用代碼還有一些可以優化的地方,今天就來講解講解。

主要就是對IContextMenu::QueryContextMenu方法的使用上。這個方法的最後一個參數是一個标志位的組合,在可用的标志位中,有這麼一個CMF_DEFAULTONLY,我們先來看看MSDN文檔對它的描述:

IContextMenu第八部分:預設菜單的優化

從MSDN的描述來看,這個标志位主要是向IContextMenu的實作者表達這樣一層意思:如果IContextMenu實作者不會修改菜單的預設菜單項,則不應該向菜單中添加任何其他的菜單。也就是說,實作者隻需要關心預設菜單項就可以了。

我們看看下面修改之後的代碼,請注意下圖中藍色的改動部分:

IContextMenu第八部分:預設菜單的優化

通過這個代碼修改,我在我的機器上做了性能測試發現,調用

IContextMenu::QueryContextMenu的時間由之前的100毫秒降至50毫秒。注意,在其他機器上執行的時間可能不盡相同。這主要取決于目标機器上已經安裝的第三方上下文菜單的數量以及這些第三方菜單對CMF_DEFAULTONLY這個标志位的具體實作方式。

這個小練習也揭示了這樣一個事實,即在實作IContextMenu接口時,需要慎重對待這些标志位,如果沒有正确地處理它們,則使用者可能會陷入麻煩。

總結

接口的實作者一定要遵守接口訂立的規則,這樣接口的使用者才會”一視同仁”地盡情調用。

最後

最近我寫了個東西

繼續閱讀