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

简介: 转载请说明原出处,谢谢~~         近些天在duilib群里经常有朋友问起,怎么让duilib的IE控件可以去边框,去滚动条的问题,或者是如何去控件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的工程源码为:点击打开链接


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

   Redrain  2014.10.23

目录
相关文章
|
前端开发
WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件),保存资源(图片、脚本、CSS)
WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件),保存资源(图片、脚本、CSS)
649 84
|
人工智能 自然语言处理 API
Cline:29.7K Star!一文详解VSCode最强开源AI编程搭子:一键生成代码+自动跑终端+操控浏览器...
Cline 是一款集成于 VSCode 的 AI 编程助手,支持多语言模型,实时检查语法错误,帮助开发者提高编程效率。通过智能化手段,Cline 可以生成代码、执行终端命令、调试 Web 应用,并扩展更多功能。
7634 74
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
Web App开发 XML 开发框架
技术心得记录:在IE浏览器中的奇怪页面表现
技术心得记录:在IE浏览器中的奇怪页面表现
379 0
|
JavaScript 前端开发
|
机器人 Shell 开发者
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
|
JavaScript
VUE——如何兼容IE9|IE10|IE11浏览器
VUE——如何兼容IE9|IE10|IE11浏览器
454 0
VUE——如何兼容IE9|IE10|IE11浏览器
|
安全 网络安全
用IE浏览器访问网站提示证书错误
当你在Internet Explorer中遇到证书错误提示,通常是因网站SSL/TLS证书问题或浏览器安全设置需调整。解决方法包括: 检查时间设置 调整IE设置 安装证书 调整计算机时间
2382 3
|
存储 缓存 JavaScript