C++Builder创建上下文菜单扩展处理器

C++Builder创建上下文菜单扩展处理器,第1张

C++Builder创建上下文菜单扩展处理器,第2张

当用户右键单击shell对象时,shell会显示其上下文菜单。文件对象有大量的标准菜单项,如“剪切”和“复制”,这是默认的菜单项。如果对象是文件并且是file类的成员,它可以在注册表中指定附加菜单项。检查Shell注册表,查看文件类型是否与某些上下文菜单处理程序相关联。如果是这样,shell将咨询这些处理程序是否添加额外的菜单项。
上下文菜单处理程序是一个外壳扩展处理程序,用于向现有上下文菜单添加命令。上下文菜单处理程序都与特定的文件类相关联,并在显示此类文件成员的上下文菜单时被调用。通过实现和注册这样的处理程序,您可以动态地将菜单项添加到对象的上下文菜单中,从而为特殊对象定制菜单。
上下文菜单处理程序的工作原理
作为一个外壳扩展处理程序,上下文菜单处理程序和其他所有处理程序一样,都是一个进程内的COM对象,即对象实现为动态链接库(DLL)。除了IUnknown接口,上下文菜单还必须导出IShellExtInit和IContextMenu接口。或者,上下文菜单也可以导出IContextMenu2和IContextMenu3,可以实现自绘菜单项。
ISHELLEXTINIT接口只被shell用来初始化处理程序,主要操作是通过处理程序的IContextMenu接口来执行的。首先,Shell调用IContextMenu::QueryContextMenu并发送一个HMENU句柄,该方法使用它来增加上下文菜单。如果用户高亮显示这些新添加的命令项之一,将调用IContextMenu::GetCommandString来获取该菜单的帮助信息,并将其显示在资源管理器的状态栏上。如果用户单击处理程序的条目,shell将调用IcontextMenu:: Invoke命令,以便处理程序可以执行适当的操作。
实现IContextMenu接口
1。实现QueryContextMenu方法
外壳允许处理程序通过调用Icontext Menu:: Query Context Menu将其菜单项添加到菜单中。上下文菜单共有五个参数,每个参数的作用如下:
1) hmenu: hmenu type,表示上下文菜单的句柄。
2) IndexMenu:要添加的第一个菜单索引。
3) IdCmdFirst:添加的菜单ID的初始值。
4) idCmdLast:添加的菜单ID值。
5) UFFlags:与上下文菜单相关的状态标志有三种,如下:
CMF _默认只有用户选择默认命令,通常通过双击对象生成。在将控制返回到外壳之前,QueryContextMenu不应修改菜单。
CMF _节点默认菜单中没有默认条目。此方法应该将其命令添加到菜单中。
CMF _正常上下文菜单将正常显示。此方法应该将其命令添加到菜单中。
必须注意,任何添加的菜单项的ID必须位于两个参数idCmdFirst和idCmdLast的中间。通常第一个添加的菜单项的ID设置为idCmdFirst,以后每添加一个菜单项,ID就加1。这样,即使shell调用多个处理程序,也可以确保菜单项的ID不超过idCmdLast和可能的ID值。
ID和idCmdFirst之间的菜单项ID的命令偏移量不同。应该保存handler添加到上下文菜单中的每个菜单项的偏移量,因为如果shell依次调用GetCommandString或InvokeCommand,就可以用它来标识菜单项的ID。
每个添加的命令也应该有一个动词。动词是独立于语言的字符串。调用InvokeCommand时,经常用verb代替offset来标识命令。
query context Menu方法通过使用InsertMenu或InsertMenuItem添加新菜单项,然后返回严格设置为SEVERITY_SUCCESS的HRESULT值,并将其值设置为分配的命令ID。例如,如果idCmdFirst为5,添加了三个菜单项,ID分别为5,7,8,那么返回值应该是MAKE_HRESULT(SEVERITY_SUCCESS,0,8-5+1)。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++Builder创建上下文菜单扩展处理器

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情