首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 等级考试 > 复习指导 >

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

2008-12-28 
Shell检查注册表,看看文件类型是否与一些上下文菜单handler相关联,如果是,shell会咨询这些handler是否添加额外的菜单项。


  一般,这个方法可以不用处理,以下示例程序直接返回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字符串。

  CMINVOKECOMMANDINFO的成员简介如下:

  1) cbSize :结构的大小。

  2) fMask :为0,或下列标志的组合。

  CMIC_MASK_ASYNCOK 在返回之前等待DDE会话结束

  CMIC_MASK_FLAG_NO_UI 当执行命令时,系统防止显示用户接口元素(如错误信息)

  CMIC_MASK_HOTKEY dwHotKey 成员有效

  CMIC_MASK_ICON hIcon成员有效

  CMIC_MASK_NO_CONSOLE 如果上下文菜单handler必须创建新进程,正常情况下将创建一个控制台,设置CMIC_MASK_NO_CONSOLE标志可以禁止创建新的控制台

  3) hwnd :拥有上下文菜单窗口的句柄,handler可以使用这个句柄显示自己的信息提示框和对话框。

  4) lpVerb :32位值,高位字包含0,低位字是命令的菜单ID偏移。当用户选择一个菜单命令时,Shell用MAKEINTRESOURCE宏产生这个值,如果高位字不是0,那么这个成员指向一个以NULL结尾的字符串,指出命令的语言无关的名称,即上文的verb.典型情况下,当命令被一个应用程序激活时,这个成员是一个字符串。系统提供了下面几个预定义的常数值:

  值:CMDSTR_NEWFOLDER  字符串:"NewFolder"

  值:CMDSTR_VIEWDETAILS  字符串:"ViewDetails"

  值:CMDSTR_VIEWLIST  字符串:"ViewList"

  5) lpParameters :命令传送的参数字符串,对于shell扩展插入的菜单项,这个成员总是NULL.

  6) lpDirectory :目录名称,对于shell扩展插入的菜单项,这个成员总是NULL.

  7) nShow :显示窗口或启动应用程序时,传递给ShowWindow函数的参数。

  8) dwHotKey :分配给被命令激活的应用程序的热键。如果fMask 不是CMIC_MASK_HOTKEY,这个成员被忽略。

  9) hIcon :被命令激活的应用程序使用的图标。如果fMask 不是CMIC_MASK_ICON,这个成员被忽略。

  以下示例先打开一个"选择文件"的对话框,然后用所选择的程序打开在资源管理器中被选择的文件。为了简化,假定在资源管理器只选择了一个文件。

  HRESULT __stdcall TAddContextMenuImpl::InvokeCommand(LPCMINVOKECOMMANDINFO pici)

  {

  if(HIWORD(pici->lpVerb)==0)

  {

  if(LOWORD(pici->lpVerb)==0) // 添加的第一个菜单项

  {

  TOpenDialog *Dlg=new TOpenDialog(NULL);

  Dlg->Title="打开\"";

  Dlg->Title=Dlg->Title+g_szFilePath+"\"";

  Dlg->Options.Clear();

  Dlg->Options << ofFileMustExist << ofPathMustExist << ofNoChangeDir;

  if(Dlg->Execute())

  {

  ShellExecute(pici->hwnd,"open",Dlg->FileName.c_str(),g_szFilePath,NULL,SW_SHOW);    }

  return S_OK;

  }

  }

  return S_FALSE;

  }

 

3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.net/exam/

热点排行