去WebBrowser控件的3d边框,示例代码段

kagula at 2014-08-07


下面的代码演示如何去html中的边框

在html页面中加入下面的代码

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

下面的代码演示如何去iframe的3d边框

调用者代码

void CcatWelcomeDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
{	
	CComQIPtr<IWebBrowser2>              piWB(pDisp);
	CComPtr<IDispatch>                  pdispDoc;

	if (!piWB)
		return;

	piWB->get_Document(&pdispDoc);

	if (!pdispDoc)
		return;

	if (KillHtmlScrollBars(pdispDoc))
		TRACE(_T("success killhtml.\n"));
	else
		TRACE(_T("failed killhtml"));


	kagula::SetUIHandler(m_pWebBrowser, pDisp, URL);
}



MyWebBrowser.h

#pragma once

#include <Mshtmhst.h>

namespace kagula
{
	class CMyWebBrowser : public IDocHostUIHandler
	{
	public:
		CMyWebBrowser() { m_cRef = 0; }
		virtual ~CMyWebBrowser() {}

		LONG                m_cRef;

		HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
		{
			HRESULT result = S_OK;

			if (IsBadWritePtr(ppvObject, sizeof(LPVOID))) 
				result = E_INVALIDARG;  

			if (result == S_OK)
			{
				*ppvObject = NULL; 

				if ( IsEqualIID( riid, IID_IUnknown ) )
					*ppvObject = this;
				//             else if ( IsEqualIID( riid, IID_IOleClientSite ) )
				//                 *ppvObject = (IOleClientSite *) this;
				else if ( IsEqualIID( riid, IID_IDocHostUIHandler ) )
					*ppvObject = (IDocHostUIHandler *) this;
				else
					result = E_NOINTERFACE;
			}

			if (result == S_OK)
				this->AddRef(); 

			return result; 
		}

		ULONG STDMETHODCALLTYPE AddRef(){
			InterlockedIncrement(&m_cRef); 
			return m_cRef;
		}

		ULONG STDMETHODCALLTYPE Release() {
			ULONG ulRefCount = InterlockedDecrement(&m_cRef);

			return ulRefCount; 
		}
	private:
		HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable) { return E_NOTIMPL; }

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

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

		HRESULT STDMETHODCALLTYPE GetExternal(IDispatch **ppDispatch){return E_NOTIMPL;}

		HRESULT STDMETHODCALLTYPE GetOptionKeyPath(LPOLESTR *pchKey,DWORD dw){return E_NOTIMPL;}

		STDMETHOD(GetHostInfo)(DOCHOSTUIINFO *pInfo) {
			pInfo->cbSize = sizeof(DOCHOSTUIINFO);
			pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DBORDER;
			pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
			pInfo->pchHostCss = 0;
			pInfo->pchHostNS = 0;

			return S_OK;
		}

		HRESULT STDMETHODCALLTYPE HideUI(VOID){return E_NOTIMPL;}

		HRESULT STDMETHODCALLTYPE OnDocWindowActivate(BOOL fActivate){return E_NOTIMPL;}

		HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(BOOL fActivate){return E_NOTIMPL;}

		HRESULT STDMETHODCALLTYPE ResizeBorder(LPCRECT prcBorder,IOleInPlaceUIWindow *pUIWindow,BOOL fFrameWindow){return E_NOTIMPL;}

		HRESULT STDMETHODCALLTYPE ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved,IDispatch *pdispReserved){return S_OK;}

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

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

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

		HRESULT STDMETHODCALLTYPE UpdateUI(VOID) {return E_NOTIMPL;}
	}; 
	void SetUIHandler(IDocHostUIHandler *handler,LPDISPATCH pDisp, VARIANT* URL);
}

MyWebBrowser.cpp

#include "stdafx.h"

#include "MyWebBrowser.h"

/*
参考资料
[1]《BUG: Scroll Bars and Borders Appear in Framesets When You Navigate Again in BeforeNavigate》
http://support.microsoft.com/default.aspx?scid=kb;en-us;324419
[2]《How to get the original IDocHostUIHandler provided by Internet Explorer?》
http://stackoverflow.com/questions/7701465/how-to-get-the-original-idochostuihandler-provided-by-internet-explorer
*/
namespace kagula
{
	void SetUIHandler(IDocHostUIHandler *handler,LPDISPATCH pDisp, VARIANT* URL) 
	{	
		HRESULT hr = S_OK;
		IWebBrowser2* pWB = NULL;

		//WebBrowser2 instance
		hr = pDisp->QueryInterface(IID_IWebBrowser2, reinterpret_cast<void**>(&pWB));
		if (hr!=S_OK)
			return;

		//Default Document instance
		IDispatch* pDocDisp = NULL;
		hr = pWB->get_Document(&pDocDisp);
		if (hr!=S_OK)
		{
			pWB->Release();
			return;
		}

		//ICustomDoc instance
		ICustomDoc* pCustomDoc; 
		hr = pDocDisp->QueryInterface(IID_ICustomDoc,(LPVOID*)&pCustomDoc); 
		if(SUCCEEDED(hr)) 
		{ 
			pCustomDoc->SetUIHandler(handler); 
			pCustomDoc->Release(); 
		} 

		pDocDisp->Release();
		pWB->Release();
	}//end func
}//end namespace


演示如何去全局scrollbar

BOOL CcatWelcomeDlg::KillHtmlScrollBars(LPDISPATCH pdispDoc)
{
	CComQIPtr<IHTMLDocument2> piDoc(pdispDoc);
	CComPtr<IHTMLElement>     piElem;
	CComPtr<IHTMLBodyElement> piBody;

	if (!piDoc)
		return FALSE;

	piDoc->get_body(&piElem);

	if (!piElem)
		return  FALSE;

	/*CComBSTR bstrText = NULL;
	HRESULT hr = piElem->get_outerHTML(&bstrText);
	if (SUCCEEDED(hr))
	{
		CString strHtml(bstrText);
		AfxMessageBox(strHtml);
	}*/

	piElem->QueryInterface(&piBody);

	if (!piBody)
		return FALSE;

	return SUCCEEDED(piBody->put_scroll(CComBSTR(_T("Auto"))));
}

还可以参考《WebBrowser控件如何屏蔽javascript错误


WebBrowser控件如何屏蔽javascript错误

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kagula086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值