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个方法要实现,结果去查,果然如此,实现之后,搞定~~~
C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)的更多相关文章
- C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)控制 WebBrowser 控件的外观和行为
在 CSDN 上经常看到以下两个问题:1.在 MFC 应用程序中,如果创建了一个 WebBrowser 控件(包括 CHtmlView 在内),如何可以把该控件的三维边框禁止掉?2.在 MFC 应用程 ...
- MFC中CTime获取日期时间的方法
MFC中CTime类的功能非常强大,可以获取年.月.日.小时.分钟.秒.星期等等,最最重要的是可根据需要去格式化.下面是具体的使用方式: ① 定义一个CTime类对象 CTime time; ② 得到 ...
- 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类
转自: http://blog.csdn.net/sunguangran/article/details/6069317 非常感谢原作者,整理的这么详细. 在java中可有两种方式实现多线程,一种是继 ...
- VC6.0 MFC中WebBrowser控件禁止新窗口弹出的解决办法
http://blog.csdn.net/gnorth/article/details/7258293 分类: WebBrowser MFC 禁止新窗口2012-02-14 15:25 1787人阅读 ...
- c#中WebBrowser控件的使用方法
首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第 ...
- MFC中CListCtrl控件的使用方法
定义一个派生类CViewList 派生于CListCtrl 在要包含该控件的类(CView)中定义一个CViewList类型的变量 CViewList m_wndListView; 在CView响应的 ...
- mfc中CString转化为string的方法
LL(1)分析法实验的mfc做到最后因为CString转化为string的问题卡了一个多小时,也是惨,网上各种方法找过都不行.幸亏最后还是找到几行代码搞定了.特此mark一下. USES_CONVER ...
- MFC中的几种播放声音的方法
一.播放声音文件的简单方法 在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数.利用这些函数可以方便地播放声音.最简单的播放声音方法就是直接调用VC++中提供的声音播放函 数BOOL s ...
- MFC中线程相关知识
MFC中把线程分为两种类型,UI线程和工作者线程. MFC中启动一个线程的最好方法是调用AfxBeginThread,有两个版本,一个用于启动Ui线程,另外一个用于启动工作者线程.在MFC程序中,只有 ...
随机推荐
- c++ 重载,覆盖,重定义 2
前一篇 http://www.cnblogs.com/iois/p/4085173.html 写有些地方不够准确,重新整理了一遍 函数重载(Function Overloading) C++允许同一范 ...
- QtSoap调用Web Service(QtSoap是非官方应用)
今天学习如何用QtSoap访问Web Service服务.这里调用的是查询QQ在线状态的服务qqOnlineWebService.调用的几个步骤: 1.创建QtSoapMessage对象 messag ...
- Android dialog 问题
1.dialog.dismiss和dialog.cancel的区别 Cancel the dialog. This is essentially the same as calling dismiss ...
- python去掉html标签
s = '<SPAN style="FONT- SIZE: 9pt">开始1~3<SPAN lang=EN-US>& lt;?xml:namespa ...
- fg、bg、jobs、&、nohup、ctrl + z命令
fg.bg.jobs.&.nohup.ctrl + z命令 一.& 加在一个命令的最后,可以把这个命令放到后台执行,如gftp &, 二.ctrl + z 可以将一个正在前台执 ...
- 基于visual Studio2013解决C语言竞赛题之0610冒泡排序函数
题目
- Java__jar包的简单操作
工作需要研究了下jar,这里就举个简单的例子,以helloworld为例吧 1.启动eclipse编写代码: 次步不做赘述 package cn.test.jar; public class Hell ...
- 字符设备驱动[深入]:linux cdev详解
linux cdev详解 http://blog.chinaunix.net/uid-24517893-id-161446.html 用cdev_add添加字符设备驱动: //linux2.6中用c ...
- OC中线程的状态相关
1.线程的状态NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; ...
- 基于visual Studio2013解决C语言竞赛题之1029二元数组平均值
题目 解决代码及点评 /* 功能:求二维数组中每行元素的平均值,不许引入其它的数组 时间:16:21 2013/10/24 */ #include<stdio ...