• duilib 的IE浏览器控件去边框和去滚动栏的代码


    转载请说明原出处,谢谢~~


            近些天在duilib群里常常有朋友问起,怎么让duilib的IE控件能够去边框。去滚动栏的问题,或者是怎样去控件IE控件的行为。为了避免反复的回答,我就写一篇博文,把处理方法说明一下。

            duilib中有Webbrowser控件,是继承ActivexUI控件后针对IE进行的封装。使用IE控件的话就用他了。

    这个控件留了一个接口名为SetWebBrowserEventHandler,这个函数用了指定一个事件处理器,来控制IE的行为。

    而这个函数须要一个CWebBrowserEventHandler对象指针,这个CWebBrowserEventHandler类在duilib的Utils文件夹中已经写好了,是一个主要的事件处理器框架,仅仅要重写这个CWebBrowserEventHandler类的GetHostInfo函数就能够控制去掉IE浏览器的边框和滚动栏,同一时候还有其它功能,比方控制能否够显示IE右键菜单,NavigateComplete2来截获浏览器载入完成的事件等等。

            所以我们假设要去控制浏览器,那么正确的做法就是写一个类,继承CWebBrowserEventHandler然后重写你须要的函数。

    我简单写了一个名叫CCustomWebEventHandler,代码例如以下:

    #ifndef _CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_
    #define _CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_
    
    #pragma once
    class CCustomWebEventHandler:public CWebBrowserEventHandler
    {
    public:
    	CCustomWebEventHandler() {}
    	~CCustomWebEventHandler() {}
    
    	virtual void BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel ) {}
    	virtual void NavigateError(IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel) {}
    	virtual void NavigateComplete2(IDispatch *pDisp,VARIANT *&url){	}
    
    	virtual void ProgressChange(LONG nProgress, LONG nProgressMax){}
    	virtual void NewWindow3(IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl){}
    	virtual void CommandStateChange(long Command,VARIANT_BOOL Enable){}
    
    	// interface IDocHostUIHandler
    	virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(
    		/* [in] */ DWORD dwID,
    		/* [in] */ POINT __RPC_FAR *ppt,
    		/* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
    		/* [in] */ IDispatch __RPC_FAR *pdispReserved)
    	{
    		return S_OK;
    		//return S_FALSE
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE GetHostInfo(
    		/* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo)
    	{
    		if (pInfo != NULL)
    		{		
    			pInfo->cbSize = sizeof(DOCHOSTUIINFO);  
    			pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;  
    			pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME | 
    				DOCHOSTUIFLAG_NO3DOUTERBORDER | DOCHOSTUIFLAG_DIALOG |
    				DOCHOSTUIFLAG_DISABLE_HELP_MENU;//| DOCHOSTUIFLAG_SCROLL_NO;;
    
    			//这里还能够加其它代码来控制网页
     			//LPWSTR m_pZoom = L"BODY{Zoom:100%;}";
    			//pInfo->pchHostCss = (LPWSTR)::CoTaskMemAlloc((lstrlenW(m_pZoom)+1)*2);
    			//lstrcpyW(pInfo->pchHostCss, m_pZoom);
    		}
    
    		return S_OK;
    		
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE ShowUI(
    		/* [in] */ DWORD dwID,
    		/* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,
    		/* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,
    		/* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,
    		/* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc)
    	{
    		return S_FALSE;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE HideUI( void)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE UpdateUI( void)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE EnableModeless(
    		/* [in] */ BOOL fEnable)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate(
    		/* [in] */ BOOL fActivate)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(
    		/* [in] */ BOOL fActivate)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE ResizeBorder(
    		/* [in] */ LPCRECT prcBorder,
    		/* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
    		/* [in] */ BOOL fRameWindow)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(
    		/* [in] */ LPMSG lpMsg,
    		/* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
    		/* [in] */ DWORD nCmdID)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath(
    		/* [out] */ LPOLESTR __RPC_FAR *pchKey,
    		/* [in] */ DWORD dw)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE GetDropTarget(
    		/* [in] */ IDropTarget __RPC_FAR *pDropTarget,
    		/* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE GetExternal(
    		/* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE TranslateUrl(
    		/* [in] */ DWORD dwTranslate,
    		/* [in] */ OLECHAR __RPC_FAR *pchURLIn,
    		/* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)
    	{
    		return S_OK;
    	}
    
    	virtual HRESULT STDMETHODCALLTYPE FilterDataObject(
    		/* [in] */ IDataObject __RPC_FAR *pDO,
    		/* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)
    	{
    		return S_OK;
    	}
    
    	// 	virtual HRESULT STDMETHODCALLTYPE GetOverrideKeyPath( 
    	// 		/* [annotation][out] */ 
    	// 		__deref_out  LPOLESTR *pchKey,
    	// 		/* [in] */ DWORD dw)
    	// 	{
    	// 		return E_NOTIMPL;
    	// 	}
    
    	// IDownloadManager
    	virtual HRESULT STDMETHODCALLTYPE Download( 
    		/* [in] */ IMoniker *pmk,
    		/* [in] */ IBindCtx *pbc,
    		/* [in] */ DWORD dwBindVerb,
    		/* [in] */ LONG grfBINDF,
    		/* [in] */ BINDINFO *pBindInfo,
    		/* [in] */ LPCOLESTR pszHeaders,
    		/* [in] */ LPCOLESTR pszRedir,
    		/* [in] */ UINT uiCP)
    	{
    		return S_OK;
    	}
    };
    
    #endif //_CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_

    使用他的方法例如以下:

            首先在xml中写入一个Webbrowser控件而且在c++代码中通过FindControl找到这个控件的指针,然后写类似的代码:

    	CWebBrowserUI* pActiveXUI = static_cast<CWebBrowserUI*>(m_PaintManager.FindControl(_T("ActiveXDemo1")));
    
    	if( pActiveXUI ) 
    	{
    		pActiveXUI->SetDelayCreate(false);
    		CCustomWebEventHandler *pWebHandle = new CCustomWebEventHandler;
    		pActiveXUI->SetWebBrowserEventHandler(pWebHandle);
    		pActiveXUI->Navigate2(L"about:blank");    //这行代码。假设凝视掉,就不会去掉边框,IE有bug,第二次载入网页才会让事件处理器有效
    		pActiveXUI->Navigate2(L"http://www.kugou.com/");
    	}

             这样就能够过滤边框了,效果例如以下:



           我这里强调两点

            第一、我这里仅仅是示范。为了方便。我使用的是alberl的demo。简单改了几行代码。能够看到我new了一个CCustomWebEventHandler。可是没有去delete。所以自己使用时千万要注意代码规范!!

           第二、先载入了一个blank页面,再跳转到目标页面,第一次载入页面不会触发事件处理器,第二次才会。为了不影响效率我直接载入blank。关于这个bug的说明,在微软官网有。详细地址我忘了~~

           整个demo的project源代码为:点击打开链接


           如有问题。请在博客留言给我

       Redrain  2014.10.23

  • 相关阅读:
    macOS免费的NTFS读写软件
    Python模块和模块引用(一)
    Python Class (一)
    Ubuntu系统管理systemd
    Case Closed?
    The 'with' and 'as' Keywords
    Buffering Data
    rstrip
    堆排序
    堆 续9
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7387796.html
Copyright © 2020-2023  润新知