首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

IContextMenu第五部分:处理菜单消息

在我们编写代码完成上下文菜单的显示之后,我们留了一个问题。

就是”打开方式”和”发送”这两个子菜单不能如预期般工作。

这是咋回事?

原因在于,这些子菜单是延迟创建的,这就解释了为什么当你尝试展开这些菜单时,没有显示出任何有用的东西。另外有些子菜单是自绘型菜单,也会存在这样的问题。

这个时候,如果要解决这个问题,就需要使用新的手段了,也就是今天我们要讲的:

IContextMenu2::HandleMenuMsg和IContextMenu3::HandleMenuMsg2这两个方法。

这里要说一则历史故事

IContextMenu2::HandleMenuMessage是新增加的IContextMenu2接口的一个方法,我们没有在原有的IContextMenu接口中直接添加,而是另外派生一个新的接口。主要原因是,IContextMenu是在Windows 95后期开发中加入的,我们觉得新增加一个接口比在原有接口上做变更会更加安全,也尽可能地保持了向后兼容,这样的带来的好处是开发者不需要重写它们的外壳扩展代码。

如果我没记错的话,

IContextMenu3::HandleMenuMessage2这个方法被添加到了Internet Explorer 4中,主要是为了支持自绘型上下文菜单键盘可访问性而添加的。

在真实程序中,这两个接口变量应该被定义为窗口类的成员变量,但为了演示目的,我将它们定义成了全局变量。当编写你自己的程序的时候,请注意,不要使用全局变量,因为当涉及第二个窗口时,它们将导致大规模混乱。因为这两个窗口都会尝试和同一个接口做交互,而实际上在同一时刻,只会有一个窗口会显示上下文菜单。

这两个接口成员会追踪当前显示的上下文菜单,我们需要在调用TrackPopupMenuEx之前或者之后对它们进行初始化或者销毁,如下图所示:

最后,我们需要在窗口过程中调用接口的方法,如下图所示:

在上面的代码中,我们首先检查接口是否为空,如果不为空,则调用其HandleMenuMsg来处理菜单相关的消息。如果调用成功,则直接返回,不再进行后续的处理流程。

通过添加上述改动到我们的例子程序中,我们会发现世界变得稍微美好了一些:”打开方式”和”发送”这两个子菜单现在可以正常工作了。

总结

我真惊了,这IContextMenu里的小坑还不少。

各位还是小心为上。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《How to host an IContextMenu, part 5 – Handling menu messages》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。

我想:你值得拥有。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20211105A07VL400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券