按关键词阅读:
文章图片
今天我们继续讲解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》
【|IContextMenu第二部分:显示上下文菜单】
稿源:(漫漫开发路)
【傻大方】网址:http://www.shadafang.com/c/11049441b2021.html
标题:|IContextMenu第二部分:显示上下文菜单