天天看點

C++(MFC)中WebBrowser去除3D邊框的方法(實作IDocHostUIHandler接口)

先說實在的:最終解決辦法是實作IDocHostUIHandler接口,在GetHostInfo方法裡解決,但“實作接口”意味着QueryInterface、AddRef、Release三個方法必須實作,是以相關代碼是:

class CMyWebBrowser : public IDocHostUIHandler

{

public:

    CMyWebBrowser() { m_cRef = 0; }

    virtual ~CMyWebBrowser() {}

    LONG                m_cRef;

private:

    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;

        }

            this->AddRef(); 

        return result; 

    }

    ULONG STDMETHODCALLTYPE AddRef(){

        InterlockedIncrement(&m_cRef); 

        return m_cRef;

    ULONG STDMETHODCALLTYPE Release() {

        ULONG ulRefCount = InterlockedDecrement(&m_cRef);

        return ulRefCount; 

    HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable) { return S_OK; }

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

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

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

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

    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 S_OK;}

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

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

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

    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 S_OK;}

    HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpMsg,

        const GUID *pguidCmdGroup,

        DWORD nCmdID

        )

    {return S_OK;}

    HRESULT STDMETHODCALLTYPE TranslateUrl(DWORD dwTranslate,

        OLECHAR *pchURLIn,

        OLECHAR **ppchURLOut

    HRESULT STDMETHODCALLTYPE UpdateUI(VOID) {return S_OK;}

};

1.要寫的更通用一點,就是上述類就這麼些内容,然後WEBBrowser從這個類繼承。

2.除了實作這個接口外,别忘了SetUIHandler,這個不難查到,這裡就不寫了。

牢騷一下:項目中用到WEBBrowser,由于項目組中隻有我一個人做過WEB,是以這玩意一直是我維護,最近由于我給裡面的Html加了DocType,導緻WEBBrowser出現了3D邊框,不管是css的border:0還是body的leftmargin和topmargin,都不管用,查了很多資料(主要是google外國人的),都說實作IDocHostUIHandler接口,在GetHostInfo方法裡能幹掉3D邊框,但我按照網上做的,結果要麼報錯,要麼GetHostInfo不走,郁悶了我,折騰了兩天,最後幾乎不懂COM的我還是覺得QueryInterface等3個方法要實作,結果去查,果然如此,實作之後,搞定~~~