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);

转载于:https://www.cnblogs.com/fanzi2009/archive/2010/05/07/1729961.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值