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

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

    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
        )
    {return S_OK;}

    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个方法要实现,结果去查,果然如此,实现之后,搞定~~~

时间: 2024-09-24 06:19:38

C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)的相关文章

mfc-怎么让MFC中Webbrowser控件的大小随对话框变化而变化?

问题描述 怎么让MFC中Webbrowser控件的大小随对话框变化而变化? 我想在你对话框中添加Webbrowser控件,怎么能它的大小随对话框大小变化呢? 解决方案 在OnSize消息处理中用MoveWindow调整 解决方案二: afx_msg void OnSize(UINT nType int cx int cy); 解决方案三: 对话框控件大小随窗口的大小变化而变化MFC对话框中的控件随着对话框大小变化而变化MFC控件随窗口大小变化

浅析c#中WebBrowser控件的使用方法

以下是对c#中WebBrowser控件的使用方法进行了详细的分析介绍,需要的朋友参考下   首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第一步只要在form_load中输入 复制代码 代码如下: webBrowser1.Navigate(Application.StartupPath + " /map.html");//引号中为网页代

MFC中WMP控件的使用方法的疑惑

问题描述 MFC中WMP控件的使用方法的疑惑 在用MFC做一个音乐播放器,插入WMP控件后,不知道如何使用它,怎么才能调用到他本身自带的类,比如fullscreen,怎么才能用他来设置全屏

在网页中实现细线表格边框的方法

网页 很多朋友都有过制作网页的经历,如今,众多网页的设计都用到了表格.这样不仅有利于网页的维护,同时,提高了网页的观赏性.在众多网页制作风格中,细边框这个制作方法是必不可少的.这里,我将简单地谈一下细边框的制作方法. 好像一般的做法是这样(css).table1{border-collapse:collapse}.table1 td{border:1px solid #ddd} 如何用表格嵌套呢?大家都知道,用Bgcolor可以在表格中任意定义表格的背景颜色,用Cellspacing可以控制表格

c#中WebBrowser控件的使用方法

     首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第一步 只要在form_load中输入 webBrowser1.Navigate(Application.StartupPath + " /map.html");//引号中为网页代码存放地址,注意要用相对地址不用绝对地址,这样才有可移植性,把网页放到程序的debug目录下,这样就可

浅析c#中WebBrowser控件的使用方法_C 语言

首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第一步只要在form_load中输入 复制代码 代码如下: webBrowser1.Navigate(Application.StartupPath + " /map.html");//引号中为网页代码存放地址,注意要用相对地址不用绝对地址,这样才有可移植性,把网页放到程序的debug目录下

ASP.NET中制作各种3D图表的方法_实用技巧

前言 大家都知道通过图表控件,我们即能表示数据又能比较各种图表的数据,例如比较去年和今年的收入.图表的类型也有很多,如柱状图.折线图.条形图.组合图等等. 首先,我将展示如何绘制出一个简单的图表. 简单图表的步骤 步骤1 新建一个"ASP.NET Empty Web Site". 步骤2 在Solution Explorer 中添加新项目,添加new form. 步骤3 工具栏-标准-项目.我们会看到在.Net Framework Component.中有两个图表选项,打勾并保存..N

MFC中使用DeviceIoControl

MFC中使用DeviceIOControl会出现找不到 .cpp(36) : error C2065: ''CTL_CODE'' : undeclared identifier .cpp(36) : error C2065: ''FILE_DEVICE_UNKNOWN'' : cpp(36) : error C2065: ''METHOD_BUFFERED'' : undeclared identifier .cpp(36) : error C2065: ''FILE_ANY_ACCESS''

Word文档中怎么去除页眉横线

  Word文档中怎么去除页眉横线         一.Word2013(Word2010)页眉横线怎么去掉 1.快捷步骤 双击页眉区域进入编辑页眉状态 → 选中页眉中的所有内容(Ctrl + A) → 单击"开始"选项卡 → 单击"边框"图标右边的小三角→ 选择"无线框". 2.详细步骤 1)双击页眉区域进入编辑页眉状态,选中页眉中的所有内容(Ctrl + A),如图1所示: 2)单击"开始"选项卡,再单击"边框&