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/");
	}

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1aG9uZ3NodQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

我这里强调两点

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

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

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

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

   Redrain  2014.10.23

时间: 2024-10-08 02:15:47

duilib 的IE浏览器控件去边框和去滚动栏的代码的相关文章

基于wke封装的duilib的webkit浏览器控件,可以c++与js互交,源码及demo下载地址

转载请说明原出处,谢谢~~ 前些日子用wke内核封装了duilib的webkit浏览器控件,好多群里朋友私聊我希望可以我公布源码,今天把这个控件的源码和使用demo公布.其实这个控件封装起来没什么难度,我只是按照原来作者的demo,把相应的消息封装成duilib对应的. 在此首先要感谢wke内核的作者BlzFans以及soui2界面库的作者flyhigh,BlzFans精简了webkit内核后封装为wke并公布了源码,flyhigh对wke进行处理让他更容易移植到dui工程中.wke内核10M大

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

近些天在duilib群里经常有朋友问起,怎么让duilib的IE控件可以去边框,去滚动条的问题,或者是如何去控件IE控件的行为.为了避免重复的回答,我就写一篇博文,把处理方法说明一下. duilib中有Webbrowser控件,是继承ActivexUI控件后针对IE进行的封装,使用IE控件的话就用他了.这个控件留了一个接口名为SetWebBrowserEventHandler,这个函数用了指定一个事件处理器,来控制IE的行为.而这个函数需要一个CWebBrowserEventHandler对象指

分享个Duilib中基于wke的浏览器控件

概述 wke是基于谷歌chrome浏览器源代码的裁剪版本,大小仅仅只有10M左右,无需依赖其他的扩展库(跟CEF的一大堆大约40M的DLL来比简直爽呆了),就可以在本地使用谷歌内核快速加载网页.网上也有基于wke在Duilib 上扩展的控件代码,其实wke头文件挺清楚的了,接口一目了然,特别是JS与C++交互的函数更是容易看懂,也没什么难的,你也可以做到的. 代码 毕竟是裁剪库,有的功能还是没有接口来处理的(比如网页加载前.页面跳转.菜单消息--),头文件代码: #ifndef __UIWKEW

WP7 浏览器控件WebBrowser历史记录、前进、后退、刷新功能实现

由于要在应用程序内部访问网页,不跳出应用.所以要实现一个浏览器.但是悲催的事windows phone8 的WebBrowser控件已经支持了像CanGoBack ,CanGoForward,GoBack,GoForward等这些功能,但是wp7没有就实现了几个前进后退几个功能.用在page里面也很简单,实现的效果如下图所示. 因为使用十分简单.和windows phone8上的WebBrowser一样的.我就直接给控件的代码,就帖使用的代码了. 代码如下,注释也都写的比较清楚. using S

UIWebView浏览器控件常用属性与方法汇总

一.什么是UIWebView UIWebView是iOS内置的浏览器控件 系统自带的Safari浏览器就是通过UIWebView实现的 二.UIWebView常用属性和方法 UIWebView常用的加载资源的方法 - (void)loadRequest:(NSURLRequest *)request; @property(nonatomic) UIDataDetectorTypes dataDetectorTypes; // 需要进行检测的数据类型 @property(nonatomic,rea

JxBrowser Java浏览器控件详细介绍

JxBrowser能在Windows.Linux.Mac OS X (Intel and PPC-based)平台上将Mozilla Firefox浏览器完美地整合到Java AWT/Swing应用程序里.该库程序使用Gecko设计引擎来转换HTML文档.因而保证了它能与许多Internet标准(如HTML 4.CSS.XML.JavaScript以及其它)兼容. 主要功能 用来将HTML浏览程序内置到AWT/Swing用户界面上的可视浏览器控件 使用Gecko 1.9/Firefox 3代码库

Essential HTMLUI 浏览器控件介绍及下载

Essential HTMLUIfor Windows Forms是一款WinForm控件用于呈现HTML,功能很像一个Web浏览器,支持各种各样的HTML标签,可以显示丰富的HTML文档,支持导出和打印. 具体功能: HTMLUI是一款完全与浏览器独立的控件,支持以URL的形式打开HTML 支持从用户驱动器路里加载任何HTML页面 支持使用图片代替文本用于连接到其他文件 支持以流的形式加载HTML文档 支持各种各样的HTML标签,格式化相关的标签 支持外部的.内在的.内嵌的样式,支持在运行时添

JxBrowser Java浏览器控件详细介绍及下载

JxBrowser能在Windows.Linux.Mac OS X (Intel and PPC-based)平台上将Mozilla Firefox浏览器完美地整合到Java AWT/Swing应用程序里.该库程序使用Gecko设计引擎来转换HTML文档.因而保证了它能与许多Internet标准(如HTML 4.CSS.XML.JavaScript以及其它)兼容. 主要功能 用来将HTML浏览程序内置到AWT/Swing用户界面上的可视浏览器控件 使用Gecko 1.9/Firefox 3代码库

C++_MFC 如何确定当页面是在 web 浏览器控件的加载

若要在 Visual C++ DocumentComplete 处理并确定完成该 Web 页的下载后,请按照下列步骤. 请注意,您所执行的步骤取决于您使用 web 浏览器控件的方式. 如果要在 CWnd/CView 对象创建 web 浏览器控件,则必须按照步骤 1 到 4. 如果您正在 CDialog/CFormView 对象中创建 web 浏览器控件,只需执行第 4 步. 如果您使用的 Visual C++ 6.0 所附带的 CHtmlView 类,重写 CHtmlView::Document