分类: 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类型,表示上下文菜单的句柄。 |