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

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-15 21:04:33

   来源:CSDN    作者:行舟

当用户右击一个shell对象时,shell会显示它的上下文菜单。文件系统对象有大量的标准菜单项,如"剪切"和"拷贝",这些都是缺省的菜单项。如果对象是一个文件,是文件类的成员,就能够在注册表里指定附加的菜单项。Shell检查注册表,看看文件类型是否与一些上下文菜单handler相关联,如果是,shell会咨询这些handler是否添加额外的菜单项。

上下文菜单handler是一种shell扩展handler,它添加命令到已有的上下文菜单中。上下文菜单handler都与特定的文件类相关联,并且在显示这类文件的成员的上下文菜单时调用。通过实现和注册这样一个handler,能够动态地添加菜单项到对象的上下文菜单上,从而为特殊的对象定制菜单。

上下文菜单Handler的工作原理

作为一种shell扩展handler,上下文菜单handler同所有其它handler一样, 是进程内COM 对象,即对象作为动态连接库 (DLL)实现。除了IUnknown接口外,上下文菜单还必须导出IShellExtInit和IContextMenu接口,作为选择,上下文菜单也能导出IContextMenu2和IContextMenu3,这些接口可以实现自画菜单项。

IShellExtInit接口仅仅被shell用来初始化handler,主要的操作通过handler的IContextMenu接口进行。Shell首先调用IContextMenu::QueryContextMenu,传送一个HMENU句柄,这个方法用它来增加上下文菜单。如果用户亮选了这些新添加的某个命令项, IContextMenu::GetCommandString将被调用,以取得这条菜单的帮助信息,把它显示在资源管理器的状态条上。如果用户单击了handler的条目,shell调用IContextMenu::InvokeCommand,从而handler能够执行合适的操作。

实现IContextMenu接口

1、实现QueryContextMenu方法

Shell通过调用IContextMenu::QueryContextMenu,允许handler把它的菜单项添加到菜单中。QueryContextMenu共有5个参数,各参数作用如下:

1) Hmenu:HMENU类型,表示上下文菜单的句柄。
2) IndexMenu:第一个被添加的菜单索引。
3) IdCmdFirst:添加的菜单ID初值。
4) idCmdLast:添加的菜单ID最大值。

5) uFlags:与上下文菜单相关的状态标志,共有3种,如下表:

CMF_DEFAULTONLY 用户选择了缺省的命令,通常是通过双击对象产生。QueryContextMenu 在把控制返回给shell前不应该修改菜单。
CMF_NODEFAULT 菜单没有缺省的条目,这个方法应该把它的命令加到菜单中。
CMF_NORMAL 上下文菜单将被正常显示,这个方法应该把它的命令加到菜单中。
阅读(353) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~