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