ATL使用IE控件,并且屏蔽右键
首先先实现IDocHostUIHandlerDispatch接口
--------------------------------------------------------------------------------------------
class ATL_NO_VTABLE CMyUIHandler : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CMyUIHandler>, public IDispatchImpl<IDocHostUIHandlerDispatch, &__uuidof(IDocHostUIHandlerDispatch)> { public: CComQIPtr<IDispatch> m_spExtDispatch; public: CMyUIHandler() { } DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CMyUIHandler) COM_INTERFACE_ENTRY(IDocHostUIHandlerDispatch) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP() // IXmnWrapperUIHandler public: // Do not show the context menu STDMETHOD (ShowContextMenu) ( /* [in] */ DWORD dwID, /* [in] */ DWORD x, /* [in] */ DWORD y, /* [in] */ IUnknown *pcmdtReserved, /* [in] */ IDispatch *pdispReserved, /* [retval][out] */ HRESULT *dwRetVal) { *dwRetVal = S_OK; return S_OK; } // Mark all the other methods as not implemented STDMETHOD (GetHostInfo) ( /* [out][in] */ DWORD *pdwFlags, /* [out][in] */ DWORD *pdwDoubleClick) { return E_NOTIMPL; } STDMETHOD (ShowUI) ( /* [in] */ DWORD dwID, /* [in] */ IUnknown *pActiveObject, /* [in] */ IUnknown *pCommandTarget, /* [in] */ IUnknown *pFrame, /* [in] */ IUnknown *pDoc, /* [retval][out] */ HRESULT *dwRetVal) { return E_NOTIMPL; } STDMETHOD (HideUI) (void) { return E_NOTIMPL; } STDMETHOD (UpdateUI) (void) { return E_NOTIMPL; } STDMETHOD (EnableModeless) ( /* [in] */ VARIANT_BOOL fEnable) { return E_NOTIMPL; } STDMETHOD (OnDocWindowActivate) ( /* [in] */ VARIANT_BOOL fActivate) { return E_NOTIMPL; } STDMETHOD (OnFrameWindowActivate) ( /* [in] */ VARIANT_BOOL fActivate) { return E_NOTIMPL; } STDMETHOD (ResizeBorder) ( /* [in] */ long left, /* [in] */ long top, /* [in] */ long right, /* [in] */ long bottom, /* [in] */ IUnknown *pUIWindow, /* [in] */ VARIANT_BOOL fFrameWindow) { return E_NOTIMPL; } STDMETHOD (TranslateAccelerator) ( /* [in] */ DWORD hWnd, /* [in] */ DWORD nMessage, /* [in] */ DWORD wParam, /* [in] */ DWORD lParam, /* [in] */ BSTR bstrGuidCmdGroup, /* [in] */ DWORD nCmdID, /* [retval][out] */ HRESULT *dwRetVal) { return E_NOTIMPL; } STDMETHOD (GetOptionKeyPath) ( /* [out] */ BSTR *pbstrKey, /* [in] */ DWORD dw) { return E_NOTIMPL; } STDMETHOD (GetDropTarget) ( /* [in] */ IUnknown *pDropTarget, /* [out] */ IUnknown **ppDropTarget) { return E_NOTIMPL; } STDMETHOD (GetExternal) ( /* [out] */ IDispatch **ppDispatch) { return m_spExtDispatch.CopyTo (ppDispatch); } STDMETHOD (TranslateUrl) ( /* [in] */ DWORD dwTranslate, /* [in] */ BSTR bstrURLIn, /* [out] */ BSTR *pbstrURLOut) { return E_NOTIMPL; } STDMETHOD (FilterDataObject) ( /* [in] */ IUnknown *pDO, /* [out] */ IUnknown **ppDORet) { return E_NOTIMPL; } };
--------------------------------------------------------------------------------------------
然后通过SetExternalUIHandler将IDocHostUIHandlerDispatch指针传进CAxHostWindow
CComPtr<IUnknown> punkCtrl; CComQIPtr<IWebBrowser2> pWB2; CComVariant v; CRect rc(0,0,640,480); m_wndIE.Create ( *this, rc, _T(""), WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE ); //m_wndIE.CreateControlEx ( L"{8856F961-340A-11D0-A96B-00C04FD705A2}", NULL, // NULL, &punkCtrl ); m_wndIE.CreateControlEx ( L"Shell.Explorer", NULL, NULL, &punkCtrl ); pWB2 = punkCtrl; if ( pWB2 ) pWB2->Navigate ( CComBSTR("http://www.microsoft.com"), &v, &v, &v, &v ); CComPtr<IUnknown> spUnk; HRESULT hr = CMyUIHandler::_CreatorClass::CreateInstance(NULL, IID_IUnknown, (void**)&spUnk); ATLASSERT(SUCCEEDED(hr)); CComQIPtr<IDocHostUIHandlerDispatch> spUI = spUnk; m_wndIE.SetExternalUIHandler(spUI);