( BCB_FANS请进)如何实现TCppWebBrowser中的IDocHostUIHandler接口

yinglang 2002-11-22 05:37:40
BCB_FANS 我查了msdn,不过还是不知道如何实现IDocHostUIHandler,希望给我一些启示,谢谢
...全文
420 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lo 2002-12-06
  • 打赏
  • 举报
回复
BCB_FANS(四大名捕之追杀令) :
果然是高手,小弟曾经为这个问题快找遍MSDN了,但还是不知道在BCB里怎么调用,不过后来我用另一种方法解决了我的问题。
不过现在看到你的代码,真的是配服死了。我想问一问,BCB_FANS大哥,你搞BCB有多久了?
yinglang 2002-11-22
  • 打赏
  • 举报
回复
真是好长阿,佩服,佩服,稍后给分,谢谢,
RomanticProgrammer 2002-11-22
  • 打赏
  • 举报
回复
不佩服BCB_FANS大哥真是不行...
bcbsoft 2002-11-22
  • 打赏
  • 举报
回复
收藏
bcb_fans 2002-11-22
  • 打赏
  • 举报
回复
主程序中的代码:

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),在此不详述。
bcb_fans 2002-11-22
  • 打赏
  • 举报
回复
提前半小时贴代码 :)

=====================================

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;
}
//---------------------------------------------------------------------------
yinglang 2002-11-22
  • 打赏
  • 举报
回复
十分感谢,不过你加班到10点正是辛苦阿^_^
bcb_fans 2002-11-22
  • 打赏
  • 举报
回复
正在上班,晚上10点给你代码。请耐心等待.........

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧