如何实现TCppWebBrowser中的IDocHostUIHandler接口
//这篇文章强悍,一定要收藏。转自:http://topic.csdn.net/t/20021122/17/1198927.html
提前半小时贴代码 :)
=====================================
DocHostUIHandlerImpl.h===============
#ifndef DocHostUIHandlerImplH
#define DocHostUIHandlerImplH
#include <ShDocVw_TLB.h>
#include <exdispid.h>
#include <mshtmhst.h>
//---------------------------------------------------------------------------
class TDocHostUIHandlerImpl : public IDocHostUIHandler
{
private:
ULONG RefCount;
public:
TDocHostUIHandlerImpl():RefCount(0){ }
// IUnknown Method
HRESULT __stdcall QueryInterface(REFIID riid, void **ppv);
ULONG __stdcall AddRef();
ULONG __stdcall Release();
// IDocHostUIHandler Method
STDMETHOD(ShowContextMenu)(
/* [in] */ DWORD dwID,
/* [in] */ POINT __RPC_FAR *ppt,
/* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
/* [in] */ IDispatch __RPC_FAR *pdispReserved);
STDMETHOD(GetHostInfo)(
/* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo);
STDMETHOD(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 E_NOTIMPL; }
STDMETHOD(HideUI)( void){ return E_NOTIMPL; }
STDMETHOD(UpdateUI)( void){ return E_NOTIMPL; }
STDMETHOD(EnableModeless)(
/* [in] */ BOOL fEnable){ return E_NOTIMPL; }
STDMETHOD(OnDocWindowActivate)(
/* [in] */ BOOL fActivate){ return E_NOTIMPL; }
STDMETHOD(OnFrameWindowActivate)(
/* [in] */ BOOL fActivate){ return E_NOTIMPL; }
STDMETHOD(ResizeBorder)(
/* [in] */ LPCRECT prcBorder,
/* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
/* [in] */ BOOL fRameWindow){ return E_NOTIMPL; }
STDMETHOD(TranslateAccelerator)(
/* [in] */ LPMSG lpMsg,
/* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
/* [in] */ DWORD nCmdID){ return E_NOTIMPL; }
STDMETHOD(GetOptionKeyPath)(
/* [out] */ LPOLESTR __RPC_FAR *pchKey,
/* [in] */ DWORD dw){ return E_NOTIMPL; }
STDMETHOD(GetDropTarget)(
/* [in] */ IDropTarget __RPC_FAR *pDropTarget,
/* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget){ return E_NOTIMPL; }
STDMETHOD(GetExternal)(
/* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch){ return E_NOTIMPL; }
STDMETHOD(TranslateUrl)(
/* [in] */ DWORD dwTranslate,
/* [in] */ OLECHAR __RPC_FAR *pchURLIn,
/* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut){ return E_NOTIMPL; }
STDMETHOD(FilterDataObject)(
/* [in] */ IDataObject __RPC_FAR *pDO,
/* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet){ return E_NOTIMPL; }
};
//---------------------------------------------------------------------------
#endif
DocHostUIHandlerImpl.cpp=============
#include <Vcl.h>
#pragma hdrstop
#include "DocHostUIHandlerImpl.h "
//---------------------------------------------------------------------------
// IUnknown Method
//---------------------------------------------------------------------------
//QueryInterface
HRESULT __stdcall TDocHostUIHandlerImpl::QueryInterface(REFIID riid, void **ppv)
{
if(IsEqualIID(riid,IID_IUnknown))
{
*ppv = static_cast <IUnknown*> (this);
return S_OK;
}
else if(IsEqualIID(riid,IID_IDocHostUIHandler))
{
*ppv = static_cast <IDocHostUIHandler*> (this);
return S_OK;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
}
//---------------------------------------------------------------------------
//AddRef
ULONG __stdcall TDocHostUIHandlerImpl::AddRef()
{
InterlockedIncrement((long*)&RefCount);
return RefCount;
}
//---------------------------------------------------------------------------
//Release
ULONG __stdcall TDocHostUIHandlerImpl::Release()
{
if(InterlockedDecrement((long*)&RefCount) <= 0)
delete this;
return RefCount;
}
//---------------------------------------------------------------------------
// IDocHostUIHandler Method
//---------------------------------------------------------------------------
STDMETHODIMP TDocHostUIHandlerImpl::ShowContextMenu(DWORD dwID,POINT *ppt,
IUnknown *pcmdtReserved,IDispatch *pdispReserved)
{
MessageBox(NULL,AnsiString( "ShowContextMenu ID = " + IntToStr(dwID)).c_str(),
NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING);
return S_OK;
}
//---------------------------------------------------------------------------
STDMETHODIMP TDocHostUIHandlerImpl::GetHostInfo(DOCHOSTUIINFO *pInfo)
{
pInfo-> dwFlags = pInfo-> dwFlags | DOCHOSTUIFLAG_NO3DBORDER;
return S_OK;
}
//---------------------------------------------------------------------------
主程序中的代码:
TDocHostUIHandlerImpl *FDocHostUIHandler;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
FDocHostUIHandler = new TDocHostUIHandlerImpl();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete FDocHostUIHandler;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//*/
CppWebBrowser1-> Navigate(L "about:blank ");
while(CppWebBrowser1-> Document == NULL)
{
Sleep(10);
Application-> ProcessMessages();
}
//传递接口指针到IHTMLDocument2
ICustomDoc *m_spCustDoc;
HRESULT hr;
hr = CppWebBrowser1-> Document-> QueryInterface(IID_ICustomDoc,(void**)&m_spCustDoc);
if(SUCCEEDED(hr))
{
hr = m_spCustDoc-> SetUIHandler(FDocHostUIHandler);
if(hr != S_OK)
{
MessageBox(NULL,AnsiString(AnsiString( "Can not bind IDocHostUIHandler instance to ") +
"IHTMLDocument2.Err = " + SysErrorMessage(hr)).c_str(),
NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING);
}
else
{
MessageBox(NULL, "Succeeded ",NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING);
}
m_spCustDoc-> Release();
}
//*/
}
//---------------------------------------------------------------------------
虽然可以通过这个接口定制一些自己需要的特征,不过好像用处也不太大。上面的代码仅仅是取消3D边框以及在TCppWebBrowser上单击右键时显示一个自己的提示框。如果楼主想定制别的东西,可以参考MSDN(IEREF.CHM),在此不详述。