IE中实现自定义的菜单

参考MSDN的一篇文章

可以通过判断 dwID 加载不同的菜单

  #define IDR_BROWSE_CONTEXT_MENU 24641
  #define IDR_FORM_CONTEXT_MENU 24640
  #define SHDVID_GETMIMECSETMENU 27
  #define SHDVID_ADDMENUEXTENSIONS 53

HRESULT CBrowserHost::ShowContextMenu(DWORD dwID, POINT *ppt,IUnknown *pcmdTarget,IDispatch *pdispObject)
{

  HRESULT hr;
  HINSTANCE hinstSHDOCLC;
  HWND hwnd;
  HMENU hMenu;

  CComPtr spCT;
  CComPtr spWnd;

  MENUITEMINFO mii = {0};
  CComVariant var, var1, var2;
  hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT);
  hr = pcmdTarget->QueryInterface(IID_IOleWindow, (void**)&spWnd);
  hr = spWnd->GetWindow(&hwnd);//取得浏览器窗口句柄
  hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL"));
  if (hinstSHDOCLC == NULL)
  {
    // Error loading module -- fail as securely as possible
    return;
  }
  hMenu = LoadMenu(hinstSHDOCLC, MAKEINTRESOURCE(IDR_BROWSE_CONTEXT_MENU));
  hMenu = GetSubMenu(hMenu, dwID);
  // Get the language submenu
  hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var);
  mii.cbSize = sizeof(mii);
  mii.fMask = MIIM_SUBMENU;
  mii.hSubMenu = (HMENU) var.byref;
  // Add language submenu to Encoding context item
  SetMenuItemInfo(hMenu, IDM_LANGUAGE, FALSE, &mii);
  // Insert Shortcut Menu Extensions from registry
  V_VT(&var1) = VT_INT_PTR;
  V_BYREF(&var1) = hMenu;
  V_VT(&var2) = VT_I4;
  V_I4(&var2) = dwID;
  hr = spCT->Exec(&CGID_ShellDocView, SHDVID_ADDMENUEXTENSIONS, 0, &var1, &var2);
  // Remove View Source
  DeleteMenu(hMenu, IDM_VIEWSOURCE, MF_BYCOMMAND);//删除“查看源文件”菜单项
  // Show shortcut menu
  int iSelection = ::TrackPopupMenu(hMenu,
    TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,//返回用户选择的菜单命令ID
    ppt->x,
    ppt->y,
    0,
    hwnd,
    (RECT*)NULL);
  // Send selected shortcut menu item command to shell
  LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL);//发送到Internet Explorer_Server进行内部处理。
  FreeLibrary(hinstSHDOCLC);
  return S_OK;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值