先说实在的:最终解决办法是实现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个方法要实现,结果去查,果然如此,实现之后,搞定~~~

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

  1. C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)控制 WebBrowser 控件的外观和行为

    在 CSDN 上经常看到以下两个问题:1.在 MFC 应用程序中,如果创建了一个 WebBrowser 控件(包括 CHtmlView 在内),如何可以把该控件的三维边框禁止掉?2.在 MFC 应用程 ...

  2. MFC中CTime获取日期时间的方法

    MFC中CTime类的功能非常强大,可以获取年.月.日.小时.分钟.秒.星期等等,最最重要的是可根据需要去格式化.下面是具体的使用方式: ① 定义一个CTime类对象 CTime time; ② 得到 ...

  3. 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类

    转自: http://blog.csdn.net/sunguangran/article/details/6069317 非常感谢原作者,整理的这么详细. 在java中可有两种方式实现多线程,一种是继 ...

  4. VC6.0 MFC中WebBrowser控件禁止新窗口弹出的解决办法

    http://blog.csdn.net/gnorth/article/details/7258293 分类: WebBrowser MFC 禁止新窗口2012-02-14 15:25 1787人阅读 ...

  5. c#中WebBrowser控件的使用方法

    首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第 ...

  6. MFC中CListCtrl控件的使用方法

    定义一个派生类CViewList 派生于CListCtrl 在要包含该控件的类(CView)中定义一个CViewList类型的变量 CViewList m_wndListView; 在CView响应的 ...

  7. mfc中CString转化为string的方法

    LL(1)分析法实验的mfc做到最后因为CString转化为string的问题卡了一个多小时,也是惨,网上各种方法找过都不行.幸亏最后还是找到几行代码搞定了.特此mark一下. USES_CONVER ...

  8. MFC中的几种播放声音的方法

    一.播放声音文件的简单方法 在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数.利用这些函数可以方便地播放声音.最简单的播放声音方法就是直接调用VC++中提供的声音播放函 数BOOL s ...

  9. MFC中线程相关知识

    MFC中把线程分为两种类型,UI线程和工作者线程. MFC中启动一个线程的最好方法是调用AfxBeginThread,有两个版本,一个用于启动Ui线程,另外一个用于启动工作者线程.在MFC程序中,只有 ...

随机推荐

  1. Oracle中查询各种对象的方法小结

    --查看当前库中的所有表select * from all_tables a where a.table_name='INFOCODE_P20081'--查看表结构select * from all_ ...

  2. Android调整TimePicker和DatePicker大小

    最近写了个app,里面要将DatePicker和TimePicker并列显示.但是,Android内部把DatePicker和 TimePicker大小固定了,导致4.5寸手机屏幕一行只能显示出一个, ...

  3. nm命令

    它用来列出一个目标文件中的各种符号. nm命令还是比较简单而且强大的.它用来列出一个目标文件中的各种符号.符号的种类很多,以下是一些常见的符号类型 nm输出字符 含义 R Read only symb ...

  4. 一步一步重写 CodeIgniter 框架 (3) —— 用面向对象重构代码

    前面两篇文章为了重点突出 CodeIgniter 框架的原理,程序的结构很乱,有很多全局变量,在这一课中我们采用面向对象的方法对原先代码进行重构. 到目前为止,程序主要完成的就是 URL 分析,并根据 ...

  5. Resist the Temptation of the Singleton Pattern

    Resist the Temptation of the Singleton Pattern Sam Saariste THE SiNGLETON PATTERN SOLVES MANY OF YOU ...

  6. HDU1058 Humble Numbers 【数论】

    Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  7. PHP - 验证用户名

    /** * * 函数名:_check_username($user_str,$min_num,$max_num); * 作用:检测用户名是否符合格式 * 参数: * 1:用户名 * 2:不得小于多少位 ...

  8. BZOJ 1592: [Usaco2008 Feb]Making the Grade 路面修整( dp )

    最优的做法最后路面的高度一定是原来某一路面的高度. dp(x, t) = min{ dp(x - 1, k) } + | H[x] - h(t) | ( 1 <= k <= t ) 表示前 ...

  9. 不用SWIG,Go使用C++代码的方式

    将C++代码用C作一次封装,就可以让Go调用了. 这是一个C++头文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #ifndef CGO_CPPGO_C ...

  10. python之数据库操作(sqlite)

    python之数据库操作(sqlite) 不像常见的客户端/服务器结构范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分.所以主要的通信协议是在编程语言内的直接A ...