| HRESULTIDocHostUIHandler::ShowContextMenu( DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved ); |
dwID参数的意义与Contexts的组合类似;ppt为菜单的弹出点屏幕坐标;pcmdtReserved接口指向IOleCommandTarget接口,可用于检测网页对象的状态和执行命令等操作。pdispReserved在IE5以上版本中指向的是网页对象的IDispatch接口,用以区分不同对象,比如我们可以这样来获得网页对象的指针:
| IHTMLElement *pElem; HRESULT hr; hr = pdispReserved->QueryInterface(IID_IHTMLElement, (void**)pElem); if(SUCCEEDED (hr)) { BSTR bstr; pElem->get_tagName(bstr); USES_CONVERSION; ATLTRACE("TagName:%s\n", OLE2T(bstr)); SysFreeString(bstr); pElem->Release(); } |
如果我们在该方法中返回S_OK,则告诉MSHTML我们将使用自己的菜单(界面),如果是S_FALSE,则弹出默认的菜单。 2)实现 原理清楚之后,实现起来非常简单,和弹出一般的菜单没什么两样,举例如下,显示主框架的“文件菜单”:
| HRESULT CMyHtmlView::OnShowContextMenu(DWORD dwID, LPPOINT ppt, IUnknown * pcmdtReserved, IDispatch *) { // 载入主菜单 HMENU hMenuParent = ::LoadMenu( ::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME) ); if (hMenuParent) { HMENU hMenu = ::GetSubMenu( hMenuParent, 0 ); // 取得“文件”子菜单 if (hMenu) { // 显示菜单 TrackPopupMenuEx( hMenu, TPM_LEFTALIGN | TPM_TOPALIGN, ppt->x, ppt->y, ::AfxGetMainWnd()->m_hWnd, NULL ); | 系列文章:Internet Explorer编程简述(一) (二) (三) (四) (五) (六)
|