您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
-->
当前位置:首页 >> 编程问答 >> VC/MFC >> 散分。。使用IContextMenu接口添加菜单项,跟其他自定义菜单项冲突

散分。。使用IContextMenu接口添加菜单项,跟其他自定义菜单项冲突

来源:网络整理     时间:2016/8/24 1:37:09     关键词:

关于网友提出的“ 散分。。使用IContextMenu接口添加菜单项,跟其他自定义菜单项冲突”问题疑问,本网通过在网上对“ 散分。。使用IContextMenu接口添加菜单项,跟其他自定义菜单项冲突”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 散分。。使用IContextMenu接口添加菜单项,跟其他自定义菜单项冲突
描述:

本帖最后由 justyan 于 2010-09-26 11:37:48 编辑

  我使用IContextMenu接口,在Windows Mobile 6的通讯录的菜单中添加一个自定义菜单项,有另一个程序也要在通讯录的菜单中添加一个自定义菜单项。例如程序1添加了菜单项A和B,程序2添加了菜单项C,打开通讯录菜单后,发现程序2的菜单项的显示顺序在程序1的菜单项之前,即显示顺序为C  A  B。现在的问题是这样的,点击菜单项C时,执行的是A的功能,点击菜单项A和B都是执行正常的功能。
  我看了一下程序2的代码,发现我们两个的程序都是参照Windows Mobile SDK中的示例代码CallingCard修改的,但我们各自的菜单项CLSID是不同的。
  哪位老兄比较熟悉这个IContextMenu接口的用法,能不能告诉我为什么会出现这样的情况?我上网查了很长时间,一直没有合理的解释。
================================================================
Data: 2010/9/22
  这么长时间了,一直没有人顶,是我问的问题太简单,又或是问题太古老,没人愿意搭理我?还是这个版面人气太少了啊。。
  这个问题我解决了,现在把问题原因和解决办法贴出来,希望对其他遇到此类问题的朋友有用。

问题原因分析:
  在系统界面添加菜单项,需要实例化IContextMenu接口,并且重写QueryContextMenu、InvokeCommand和GetCommandString三个成员函数,其中QueryContextMenu是用来添加菜单项的,QueryContextMenu函数的返回值中应该包含当前组件所添加的菜单项的数量。
  微软的Windows Mobile SDK中,提供了一个名叫CallingCard的示例工程,演示了IContextMenu接口的使用方法。示例代码中QueryContextMenu函数的返回值,是插入菜单项函数InsertMenuItem的返回值,InsertMenuItem执行成功的返回值是S_OK,而S_OK宏实际对应的数值是0,所以,当QueryContextMenu函数执行成功后,返回值实际是0。
  上文提到过,QueryContextMenu应该返回当前组件所添加的菜单项的数量,如果返回0,系统就会认为当前组件没有添加任何菜单项,从而将当前组件已经在使用的菜单ID重复分配给下一个组件,造成的结果就是后添加的菜单项占据了先添加的菜单项的菜单ID,点击先添加的菜单项实际上就会执行后添加的菜单项的动作。
  我问题中提到的,程序1和程序2都是参考示例工程CallingCard做的,其中QueryContextMenu函数的返回值都是S_OK,所以造成了现在的结果。
解决办法:
  QueryContextMenu函数的返回值应该包含当前组件添加的菜单项的数量,但返回值并不是直接等于菜单项数量,菜单项数量应该包含在返回值的低16位中,可以使用MAKE_HRESULT宏创建返回值。例如,当前组件添加了2个菜单项,那么返回值的写法应该是MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 2)。
=================================================================
Data: 2010/09/26
10天过去了,一直没人理会。。。
一开始我是提问,没人理会,后来我的问题解决了,贴出答案来散分,也没人理会,唉。。。结贴吧。。


以上介绍了“ 散分。。使用IContextMenu接口添加菜单项,跟其他自定义菜单项冲突”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3544392.html

相关图片

相关文章