COM IContextMenu::InvokeCommand - matching LPCMINVOKECOMMAND
COM IContextMenu::InvokeCommand - matching LPCMINVOKECOMMANDINFO::lpVerb to item
我已经为COM
的窗口创建了一个shell扩展,但是我似乎无法正确匹配我在IContextMenu::QueryContextMenu
过载中添加的项目的id与我在IContextMenu::InvokeCommand
过载中收到的内容。在我的代码中,我使用InsertMenu
和InsertMenuItem
(据我所知,它们做同样的事情,但后者有一些更多的功能?)。然而,我不确定传递给InsertMenu
/InsertMenuItem
的参数对应于我必须在LPCMINVOKECOMMANDINFO::lpVerb
中寻找的内容。我需要一些方法来轻松地知道,当我将x
, y
, z
添加到上下文菜单时,我可以确切地知道x
, y
或z
中的哪一个已被单击。
编辑:动词似乎等于当前菜单/子菜单中从上到下的项目的数字。然而,我有两个子菜单,每个都有x
数量的物品,所以它们有相同的id 1,2,3。如何设置自定义id之类的?
首先你应该定义一个枚举来保存菜单项的命令id,例如
enum {
CMDID_FIRST = 0,
CMDID_DOSOMETHING = CMDID_FIRST,
CMDID_DOSOMETHINGELSE,
CMDID_LAST,
};
这些ID值需要从0开始。
在你的IContextMenu::QueryContextMenu
实现中:
当您添加菜单项时,您需要通过在
MENUITEMINFO.fMask
字段中设置MIIM_ID
标志并设置MENUITEMINFO.wID
值来给每个菜单项一个ID。给每个菜单项一个从上面定义的命令ID派生的ID, 加上idCmdFirst传递给
QueryContextMenu
的值。例如,"做某事"菜单项将MENUITEMINFO.wID
设置为idCmdFirst + CMDID_DOSOMETHING
,而"做某事"将MENUITEMINFO.wID
设置为idCmdFirst + CMDID_DOSOMETHINGELSE
。QueryContextMenu
的返回值需要是MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, x)
,其中x是您添加的编号最高的项目的ID加上1(或者,如果所有项目按顺序编号,则为项目总数)。基本上,您要告诉主机当前正在使用哪些菜单项ID值,这样就不会有其他上下文菜单扩展添加与您的菜单项冲突的项。在上面的示例中,您将返回MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, CMDID_LAST)
.
In IContextMenu::InvokeCommand
:
- 使用
IS_INTRESOURCE
宏测试lpVerb
(或lpVerbW
)是否为整数值。 - 如果是,命令ID可以在低字中找到。例如,如果用户选择"Do Something Else",你会发现
LOWORD(lpVerb) == CMDID_DOSOMETHINGELSE
.
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- C++Matching Brackets 2解决方案不起作用
- "no matching function for call to 'Vector::Vector'"错误
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 为什么当我在 std::string 中打开文件名的 fstream 时出现"no matching function"错误?
- 从 TVector2 类派生复杂类:"No matching function for call to Complex::Complex()"
- 学习 c++,编译错误"no matching function for call"
- C++ "error: no matching function"
- 尝试实例化模板类的对象时出现"No Matching Constructor"错误
- 结构错误:"no matching function for call to "
- 创建函数变体向量时"No matching function for call"错误
- 为什么"std::isdigit"在 Windows 上报告C++"no matching overloaded function"
- 编译时二叉搜索树错误的反向迭代器表示"no matching function call for operator=()"
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- 提升多精度浮点数128:标准::exp错误:'no matching function for call'
- "error: no matching function for call to",我无法更改结构的定义
- 替换派生对象向量中的对象"no matching function to call"
- 我的程序显示许多错误,"error: no matching function for call to 'getPercentScore'"
- 为什么即使我定义了它们"no matching overload found"也会出现错误