让MFC的 WebBrowser 控件 使用IE8或以上的内核(默认是IE7) 并且使用IE按钮样式

完全不熟悉web方面的东西 

方法都是网上找的    具体出处没有记录


首先 让WebBrowser 使用 IE8或以上的内核


void WINAPI WriteWebBrowserRegKey(LPCTSTR lpKey,DWORD dwValue)
{
	HKEY hk;
	CString str = "Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\";
	str += lpKey;
	if (RegCreateKey(HKEY_LOCAL_MACHINE,str,&hk)!=0)
	{
		MessageBox(NULL,"打开注册表失败!","Error",0);
		ExitProcess(-1);
	}
	if (RegSetValueEx(hk,"你的exe名称.exe",NULL,REG_DWORD,(const byte*)&dwValue,4)!=0)
	{
		RegCloseKey(hk);
		MessageBox(NULL,"写注册表失败!","Error",0);
		ExitProcess(-1);
	}
	RegCloseKey(hk);
}


在 InitInstance()内

		WriteWebBrowserRegKey("FEATURE_BROWSER_EMULATION",9000);
	//	WriteWebBrowserRegKey("FEATURE_ACTIVEX_REPURPOSEDETECTION",1);
		WriteWebBrowserRegKey("FEATURE_BLOCK_LMZ_IMG",1);
		WriteWebBrowserRegKey("FEATURE_BLOCK_LMZ_OBJECT",1);
		WriteWebBrowserRegKey("FEATURE_BLOCK_LMZ_SCRIPT",1);
		WriteWebBrowserRegKey("FEATURE_Cross_Domain_Redirect_Mitigation",1);
		WriteWebBrowserRegKey("FEATURE_ENABLE_SCRIPT_PASTE_URLACTION_IF_PROMPT",1);
		WriteWebBrowserRegKey("FEATURE_LOCALMACHINE_LOCKDOWN",1);
		WriteWebBrowserRegKey("FEATURE_GPU_RENDERING",1);




下面是让WebBrowser 使用ie的风格 具体这个应该怎么称呼.不懂 -_-!   总之按钮样式不再是丑陋的 2000经典样式了


增加一个头文件


	// class name: CWebUIController  WebUIController.h 源代码: 
	// author:     Dandy Cheung
	// email:      dandycheung@21cn.com
	// date:       2005-3-18

#ifndef __WEBUICONTROLLER_H__
#define __WEBUICONTROLLER_H__
#
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <MSHTMHST.H>
#include <EXDISP.H>
#include <EXDISPID.H>

	inline 
	HRESULT _CoAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw)
{
	IConnectionPointContainer* pCPC = NULL;
	IConnectionPoint* pCP = NULL;
	HRESULT hRes = pUnkCP->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
	if(SUCCEEDED(hRes) && pCPC != NULL)
	{
		hRes = pCPC->FindConnectionPoint(iid, &pCP);
		if(SUCCEEDED(hRes) && pCP != NULL)
		{
			hRes = pCP->Advise(pUnk, pdw);
			pCP->Release();
		}

		pCPC->Release();
	}

	return hRes;
}

inline 
	HRESULT _CoUnadvise(IUnknown* pUnkCP, const IID& iid, DWORD dw)
{
	IConnectionPointContainer* pCPC = NULL;
	IConnectionPoint* pCP = NULL;
	HRESULT hRes = pUnkCP->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
	if(SUCCEEDED(hRes) && pCPC != NULL)
	{
		hRes = pCPC->FindConnectionPoint(iid, &pCP);
		if(SUCCEEDED(hRes) && pCP != NULL)
		{
			hRes = pCP->Unadvise(dw);
			pCP->Release();
		}

		pCPC->Release();
	}

	return hRes;
}

class CWebUIController : public DWebBrowserEvents2, public IDocHostUIHandler
{
	ULONG m_uRefCount;
	
	IWebBrowser2* m_pWebBrowser2;
	DWORD m_dwCookie;

	BOOL m_bEnable3DBorder;
	BOOL m_bEnableScrollBar;

public:
	CWebUIController() : m_uRefCount(0), m_pWebBrowser2(NULL), m_dwCookie(0)
	{
		m_bEnable3DBorder = TRUE;
		m_bEnableScrollBar = TRUE;
	}

	virtual ~CWebUIController()
	{
	}
public:
	// IUnknown Methods
	STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject)
	{
		*ppvObject = NULL;

		if(IsEqualGUID(riid, DIID_DWebBrowserEvents2) ||
			IsEqualGUID(riid, IID_IDispatch))
		{
			*ppvObject = (DWebBrowserEvents2*)this;
			AddRef();
			return S_OK;
		}
		else if(IsEqualGUID(riid, IID_IDocHostUIHandler) ||
			IsEqualGUID(riid, IID_IUnknown))
		{
			*ppvObject = (IDocHostUIHandler*)this;
			AddRef();
			return S_OK;
		}

		return E_NOINTERFACE;
	}

	STDMETHOD_(ULONG, AddRef)(void)
	{
		m_uRefCount++;
		return m_uRefCount;
	}

	STDMETHOD_(ULONG, Release)(void)
	{
		m_uRefCount--;
		ULONG uRefCount = m_uRefCount;
		if(uRefCount == 0)
			delete this;

		return uRefCount;
	}

	// IDispatch Methods
	STDMETHOD(GetTypeInfoCount)(unsigned int FAR* pctinfo)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)        
	{
		return E_NOTIMPL;
	}


	STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR FAR* FAR* rgszNames, 
		unsigned int cNames, LCID lcid, DISPID FAR* rgDispId)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags,
		DISPPARAMS* pDispParams, VARIANT* pvarResult,
		EXCEPINFO* pexcepinfo, UINT* puArgErr)
	{
		if(!pDispParams)
			return E_INVALIDARG;

		switch(dispidMember)
		{
			//
			// The parameters for this DISPID are as follows:
			// [0]: URL to navigate to - VT_BYREF|VT_VARIANT
			// [1]: An object that evaluates to the top-level or frame
			//      WebBrowser object corresponding to the event. 
		case DISPID_NAVIGATECOMPLETE2:

			//
			// The IDocHostUIHandler association must be set
			// up every time we navigate to a new page.
			//
			if(pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == VT_DISPATCH)
				SetCustomDoc(pDispParams->rgvarg[1].pdispVal);
			else
				return E_INVALIDARG;

			break;

		default:
			break;
		}

		return S_OK;
	}

	// IDocHostUIHandler Methods
protected:
	STDMETHOD(ShowContextMenu)(DWORD dwID, POINT FAR* ppt, IUnknown FAR* pcmdtReserved,
		IDispatch FAR* pdispReserved)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(GetHostInfo)(DOCHOSTUIINFO FAR* pInfo)
	{
		if(pInfo != NULL)
		{
			pInfo->dwFlags |= (m_bEnable3DBorder ? 0 : DOCHOSTUIFLAG_NO3DBORDER);
			pInfo->dwFlags |= (m_bEnableScrollBar ? 0 : DOCHOSTUIFLAG_SCROLL_NO);
			pInfo->dwFlags |=DOCHOSTUIFLAG_THEME; //这里是我自己添加的 让其使用IE的按钮风格
		}

		return S_OK;
	}

	STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject FAR* pActiveObject,
		IOleCommandTarget FAR* pCommandTarget,
		IOleInPlaceFrame  FAR* pFrame,
		IOleInPlaceUIWindow FAR* pDoc)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(HideUI)(void)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(UpdateUI)(void)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(EnableModeless)(BOOL fEnable)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(OnDocWindowActivate)(BOOL fActivate)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(OnFrameWindowActivate)(BOOL fActivate)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow FAR* pUIWindow,
		BOOL fRameWindow)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID FAR* pguidCmdGroup,
		DWORD nCmdID)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(GetOptionKeyPath)(LPOLESTR FAR* pchKey, DWORD dw)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(GetDropTarget)(IDropTarget* pDropTarget,
		IDropTarget** ppDropTarget)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(GetExternal)(IDispatch** ppDispatch)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR* pchURLIn,
		OLECHAR** ppchURLOut)
	{
		return E_NOTIMPL;
	}

	STDMETHOD(FilterDataObject)(IDataObject* pDO, IDataObject** ppDORet)
	{
		return E_NOTIMPL;
	}

public:
	HRESULT SetWebBrowser(IWebBrowser2* pWebBrowser2)
	{
		// Unadvise the event sink, if there was a
		// previous reference to the WebBrowser control.
		if(m_pWebBrowser2)
		{
			_CoUnadvise(m_pWebBrowser2, DIID_DWebBrowserEvents2, m_dwCookie);
			m_dwCookie = 0;
			// _CoUnadvise中就已经被Release         //  m_pWebBrowser2->Release();
		}

		m_pWebBrowser2 = pWebBrowser2;
		if(pWebBrowser2 == NULL)
			return S_OK;

		m_pWebBrowser2->AddRef();

		return _CoAdvise(m_pWebBrowser2, (IDispatch*)this, DIID_DWebBrowserEvents2, &m_dwCookie);
	}

	void Enable3DBorder(BOOL bEnable = TRUE)
	{
		m_bEnable3DBorder = bEnable;
	}

	void EnableScrollBar(BOOL bEnable = TRUE)
	{
		m_bEnableScrollBar = bEnable;
	}

private:
	void SetCustomDoc(LPDISPATCH lpDisp)
	{
		if(lpDisp == NULL)
			return;

		IWebBrowser2* pWebBrowser2 = NULL;
		HRESULT hr = lpDisp->QueryInterface(IID_IWebBrowser2, (void**)&pWebBrowser2);

		if(SUCCEEDED(hr) && pWebBrowser2)
		{
			IDispatch* pDoc = NULL;
			hr = pWebBrowser2->get_Document(&pDoc);

			if(SUCCEEDED(hr) && pDoc)
			{
				ICustomDoc* pCustDoc = NULL;
				hr = pDoc->QueryInterface(IID_ICustomDoc, (void**)&pCustDoc);
				if(SUCCEEDED(hr) && pCustDoc != NULL)
				{
					pCustDoc->SetUIHandler(this);
					pCustDoc->Release();
				}

				pDoc->Release();
			}

			pWebBrowser2->Release();
		}
	}
};

#endif // __WEBUICONTROLLER_H__



在 Dlg类里添加一个变量


CWebUIController * m_webUICtrl;


在 Dlg的  OnInitDialog() 内

	m_webUICtrl = NULL;
		LPUNKNOWN pUnk1 = m_Web.GetControlUnknown();
		MyDbgPrintf("punk1 %08X",pUnk1);
		if(pUnk1 != NULL)
		{
			IWebBrowser2* pWB2 = NULL;
			HRESULT hr = pUnk1->QueryInterface(IID_IWebBrowser2, (void**)&pWB2);
			ASSERT(SUCCEEDED(hr) && pWB2 != NULL);
			if(SUCCEEDED(hr) && pWB2 != NULL)
			{
				if (!m_webUICtrl)
				{
					m_webUICtrl = new CWebUIController();
				}
				m_webUICtrl->AddRef();
				MyDbgPrintf("gogogo");
				m_webUICtrl->Enable3DBorder(TRUE);     // 此代码禁止三维边框
		//		m_webUICtrl->EnableScrollBar(FALSE); // 此代码禁止滚动条
				m_webUICtrl->SetWebBrowser(pWB2);
				m_webUICtrl->Release();
				pWB2->Release();
			}
		}



现在就全部搞定了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值