如何实现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),在此不详述。

posted @ 2012-01-01 14:08  stma  阅读(2546)  评论(0)    收藏  举报