IContextMenu第二部分:显示上下文菜单

IContextMenu第二部分:显示上下文菜单

作者:BlogUpdater |  时间:2021-11-01 |  浏览:1415 |  评论已关闭 条评论

今天我们继续讲解IContextMenu的相关内容。
我们将会在下面的代码中演示如何在处理WM_CONTEXTMENU消息中显示一个上下文菜单,当用户在弹出的上下文菜单中选择了某个菜单项之后,我们会获取用户的选择项并做出进一步处理。

直接看代码

上面的代码是在之前的版本上修改了三个地方。

首先,我们通过重新定义HANDLE_WM_CONTEXTMENU宏来解决之前提到的多显示器支持的问题。

第二,就是处理键盘触发上下文菜单的情况。当我们碰到这种情况时,我们将坐标设置为客户区的(0, 0)坐标点,从而将上下文菜单显示在一个稍微合理可见的区域。如果用户是在一个容器的条目上触发菜单,则最好是在被选中的项目上展示上下文菜单。

第三个修改,包含了显示上下文菜单,获取用户选择并作出相应的动作。

我想,你一定十分熟悉TrackPopupMenuEx这个函数吧。在上面的例子中,我们使用了TPS_RETURNCMD这个标志来指示函数将用户的选择作为返回值返回,而不是WM_COMMAND消息来返回。

在上面的代码张工,我们还突出显示了SCRATCH_QCM_FIRST值被定义成了1,而不是0。为什么?
如果它被设置为0,则我们将不能区分用户选择了索引为0的菜单,还是用户取消了菜单的显示这两种情况。

一旦我们确定用户从上下文菜单中选择了一个菜单项,则我们将会填充CMINVOKECOMMANDEX结构体,然后在结构体的verb字段中指定用户选择的动作,并在ptInvoke成员中指定调用坐标点。

请注意,当通过菜单ID来触发菜单命令时,必须在传入IContextMenu::QueryContextMenu的参数中指定菜单项的偏移(相对于起始点)。这就是为什么我们在这里将参数减去SCRATCH_QCM_FIRST的原因。

当执行上面这个程序的时候,你可能会注意到运行时还有些问题。例如,当用户点击”打开方式”和”发送到”这两个菜单项时,程序没有按预期那样工作。另外还有其他一些不容易发现的小Bug,不要着急,我们会在后续的系列文章中来详细解说。

总结
我看,例子代码比较简短,也容易理解。
建议实际运行起来,看看效果,在实践中学习,效率更高。
毕竟:光说不练假把式。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《How to host an IContextMenu, part 2 – Displaying the context menu》

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

标签:

评论已关闭。