天天看点

IContextMenu第八部分:默认菜单的优化

在上一篇文章的结尾,我们提到对于默认菜单的调用代码还有一些可以优化的地方,今天就来讲解讲解。

主要就是对IContextMenu::QueryContextMenu方法的使用上。这个方法的最后一个参数是一个标志位的组合,在可用的标志位中,有这么一个CMF_DEFAULTONLY,我们先来看看MSDN文档对它的描述:

IContextMenu第八部分:默认菜单的优化

从MSDN的描述来看,这个标志位主要是向IContextMenu的实现者表达这样一层意思:如果IContextMenu实现者不会修改菜单的默认菜单项,则不应该向菜单中添加任何其他的菜单。也就是说,实现者只需要关心默认菜单项就可以了。

我们看看下面修改之后的代码,请注意下图中蓝色的改动部分:

IContextMenu第八部分:默认菜单的优化

通过这个代码修改,我在我的机器上做了性能测试发现,调用

IContextMenu::QueryContextMenu的时间由之前的100毫秒降至50毫秒。注意,在其他机器上执行的时间可能不尽相同。这主要取决于目标机器上已经安装的第三方上下文菜单的数量以及这些第三方菜单对CMF_DEFAULTONLY这个标志位的具体实现方式。

这个小练习也揭示了这样一个事实,即在实现IContextMenu接口时,需要慎重对待这些标志位,如果没有正确地处理它们,则用户可能会陷入麻烦。

总结

接口的实现者一定要遵守接口订立的规则,这样接口的使用者才会”一视同仁”地尽情调用。

最后

最近我写了个东西

继续阅读