Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103587308
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-15 21:04:53

    来源:CSDN    作者:行舟

必须注意的是,任何添加的菜单项的ID必须落在idCmdFirst和idCmdLast两个参数中间,通常,添加的第一个菜单项ID设为idCmdFirst,以后每添加一个菜单项,就把ID加1,这样,即使shell调用了不止一个handler,也可以确保菜单项的ID不超过idCmdLast和可能的ID最大值。

在ID和idCmdFirst之间,菜单项ID的command offset(命令偏移)是不同的,应该保存handler添加到上下文菜单中的每个菜单项的offset,因为如果shell按顺序调用GetCommandString或者InvokeCommand,可以使用它来鉴别菜单项的ID。

还应该为每一个添加的命令赋予一个verb。Verb是语言独立的字符串,当调用InvokeCommand时,常常用verb来代替偏移以鉴别命令。

QueryContextMenu 方法使用InsertMenu或InsertMenuItem 添加新的菜单项,然后返回一个严格设置为SEVERITY_SUCCESS的HRESULT值,把它的值设置为被分配的最大的命令ID。例如,假如idCmdFirst是5,添加了3个菜单项,ID分别是5,7,8,则返回值应该是MAKE_HRESULT(SEVERITY_SUCCESS, 0, 8 - 5 + 1)。

以下是一个QueryContextMenu实例:

HRESULT __stdcall TAddContextMenuImpl::QueryContextMenu(HMENU hmenu,

UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)

{

if(!(CMF_DEFAULTONLY & uFlags))

{

InsertMenu(hmenu, indexMenu, MF_STRING | MF_BYPOSITION,idCmdFirst,

_T("选择打开方式..."));

return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 1);

}

return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0));

}

2、实现GetCommandString 方法

如果用户高亮了一个handler添加的菜单项,shell将调用handler的GetCommandString方法。这个方法需要传递菜单项的偏移值(ID)、指定信息类型的标志、一个预留的参数、一个字符串缓冲区以及缓冲区的大小。

一般,这个方法可以不用处理,以下示例程序直接返回S_OK。

HRESULT __stdcall TAddContextMenuImpl::GetCommandString(UINT idCmd, UINT uFlags,

UINT *pwReserved, LPSTR pszName, UINT cchMax)

{

return S_OK;

}

3、实现InvokeCommand方法

当在上下文菜单中选择一个菜单项时,shell就会调用InvokeCommand,告诉handler运行相关联的命令。在Shlobj.h中,参数pici被声明为CMINVOKECOMMANDINFO结构,但实际上,它经常指向CMINVOKECOMMANDINFOEX结构,这个结构是CMINVOKECOMMANDINFO的扩展版本,有几个成员允许传递Unicode字符串。

阅读(370) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~