duilib 的IE浏览器控件去边框和去滚动条的代码

时间:2023-02-07 13:01:26

近些天在duilib群里经常有朋友问起,怎么让duilib的IE控件可以去边框,去滚动条的问题,或者是如何去控件IE控件的行为。为了避免重复的回答,我就写一篇博文,把处理方法说明一下。

duilib中有Webbrowser控件,是继承ActivexUI控件后针对IE进行的封装,使用IE控件的话就用他了。这个控件留了一个接口名为SetWebBrowserEventHandler,这个函数用了指定一个事件处理器,来控制IE的行为。而这个函数需要一个CWebBrowserEventHandler对象指针,这个CWebBrowserEventHandler类在duilib的Utils目录中已经写好了,是一个基本的事件处理器框架,只要重写这个CWebBrowserEventHandler类的GetHostInfo函数就可以控制去掉IE浏览器的边框和滚动条,同时还有其他功能,比如控制是否可以显示IE右键菜单,NavigateComplete2来截获浏览器加载完毕的事件等等。

所以我们如果要去控制浏览器,那么正确的做法就是写一个类,继承CWebBrowserEventHandler然后重写你需要的函数。我简单写了一个名叫CCustomWebEventHandler,代码如下:

#ifndef _CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_
#define _CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_ #pragma once
class CCustomWebEventHandler:public CWebBrowserEventHandler
{
public:
CCustomWebEventHandler() {}
~CCustomWebEventHandler() {} virtual void BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel ) {}
virtual void NavigateError(IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel) {}
virtual void NavigateComplete2(IDispatch *pDisp,VARIANT *&url){ } virtual void ProgressChange(LONG nProgress, LONG nProgressMax){}
virtual void NewWindow3(IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl){}
virtual void CommandStateChange(long Command,VARIANT_BOOL Enable){} // interface IDocHostUIHandler
virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(
/* [in] */ DWORD dwID,
/* [in] */ POINT __RPC_FAR *ppt,
/* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
/* [in] */ IDispatch __RPC_FAR *pdispReserved)
{
return S_OK;
//return S_FALSE
} virtual HRESULT STDMETHODCALLTYPE GetHostInfo(
/* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo)
{
if (pInfo != NULL)
{
pInfo->cbSize = sizeof(DOCHOSTUIINFO);
pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME |
DOCHOSTUIFLAG_NO3DOUTERBORDER | DOCHOSTUIFLAG_DIALOG |
DOCHOSTUIFLAG_DISABLE_HELP_MENU;//| DOCHOSTUIFLAG_SCROLL_NO;; //这里还可以加其他代码来控制网页
//LPWSTR m_pZoom = L"BODY{Zoom:100%;}";
//pInfo->pchHostCss = (LPWSTR)::CoTaskMemAlloc((lstrlenW(m_pZoom)+1)*2);
//lstrcpyW(pInfo->pchHostCss, m_pZoom);
} return S_OK; } virtual HRESULT STDMETHODCALLTYPE 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 S_FALSE;
} virtual HRESULT STDMETHODCALLTYPE HideUI( void)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE UpdateUI( void)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE EnableModeless(
/* [in] */ BOOL fEnable)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate(
/* [in] */ BOOL fActivate)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(
/* [in] */ BOOL fActivate)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE ResizeBorder(
/* [in] */ LPCRECT prcBorder,
/* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
/* [in] */ BOOL fRameWindow)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(
/* [in] */ LPMSG lpMsg,
/* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
/* [in] */ DWORD nCmdID)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath(
/* [out] */ LPOLESTR __RPC_FAR *pchKey,
/* [in] */ DWORD dw)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE GetDropTarget(
/* [in] */ IDropTarget __RPC_FAR *pDropTarget,
/* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE GetExternal(
/* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE TranslateUrl(
/* [in] */ DWORD dwTranslate,
/* [in] */ OLECHAR __RPC_FAR *pchURLIn,
/* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)
{
return S_OK;
} virtual HRESULT STDMETHODCALLTYPE FilterDataObject(
/* [in] */ IDataObject __RPC_FAR *pDO,
/* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)
{
return S_OK;
} // virtual HRESULT STDMETHODCALLTYPE GetOverrideKeyPath(
// /* [annotation][out] */
// __deref_out LPOLESTR *pchKey,
// /* [in] */ DWORD dw)
// {
// return E_NOTIMPL;
// } // IDownloadManager
virtual HRESULT STDMETHODCALLTYPE Download(
/* [in] */ IMoniker *pmk,
/* [in] */ IBindCtx *pbc,
/* [in] */ DWORD dwBindVerb,
/* [in] */ LONG grfBINDF,
/* [in] */ BINDINFO *pBindInfo,
/* [in] */ LPCOLESTR pszHeaders,
/* [in] */ LPCOLESTR pszRedir,
/* [in] */ UINT uiCP)
{
return S_OK;
}
}; #endif //_CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_

使用他的方法如下:

首先在xml中写入一个Webbrowser控件并且在c++代码中通过FindControl找到这个控件的指针,然后写类似的代码:

    CWebBrowserUI* pActiveXUI = static_cast<CWebBrowserUI*>(m_PaintManager.FindControl(_T("ActiveXDemo1")));

    if( pActiveXUI )
{
pActiveXUI->SetDelayCreate(false);
CCustomWebEventHandler *pWebHandle = new CCustomWebEventHandler;
pActiveXUI->SetWebBrowserEventHandler(pWebHandle);
pActiveXUI->Navigate2(L"about:blank"); //这行代码,如果注释掉,就不会去掉边框,IE有bug,第二次加载网页才会让事件处理器有效
pActiveXUI->Navigate2(L"http://www.kugou.com/");
}

我这里强调两点

第一、我这里只是示范,为了方便,我使用的是alberl的demo,简单改了几行代码。可以看到我new了一个CCustomWebEventHandler,但是没有去delete,所以自己使用时千万要注意代码规范!!

第二、先加载了一个blank页面,再跳转到目标页面,第一次加载页面不会触发事件处理器,第二次才会,为了不影响效率我直接加载blank。关于这个bug的说明,在微软官网有,具体地址我忘了~~

duilib 的IE浏览器控件去边框和去滚动条的代码的更多相关文章

  1. 基于wke封装的duilib的webkit浏览器控件,可以c&plus;&plus;与js互交,源码及demo下载地址

    转载请说明原出处,谢谢~~ 前些日子用wke内核封装了duilib的webkit浏览器控件,好多群里朋友私聊我希望可以我公布源码,今天把这个控件的源码和使用demo公布.其实这个控件封装起来没什么难度 ...

  2. duilib 的IE浏览器控件去边框和去滚动栏的代码

    转载请说明原出处,谢谢~~ 近些天在duilib群里常常有朋友问起,怎么让duilib的IE控件能够去边框.去滚动栏的问题,或者是怎样去控件IE控件的行为.为了避免反复的回答,我就写一篇博文,把处理方 ...

  3. duilib&plus;cef自定义浏览器控件编译错误

    新版博客已经搭建好了,有问题请访问 htt://www.crazydebug.com 公司二期好主播项目,决定用duilib开发界面,且从ie内核换成谷歌内核 再用duilib自定义一个Browser ...

  4. java浏览器控件jxbrowser&lpar;简单demo模拟自动登录与点击&rpar;

    写在前面: 老大让我写个脚本自动给他写dms有一段时间了,说实话当时不知道老大指的这个脚本是什么?毕竟是做web的,难道是写个数据库sql语句脚本吗?也就放在了一边.巧了,最近一个朋友说他之前写了个程 ...

  5. 将webkit内核封装为duilib的浏览器控件

    转载请说明出处,谢谢~~ 原本的duilib是自带浏览器控件的,但是使用了IE内核,我在做仿酷狗音乐播放器时,在右侧乐库要用到浏览器控件,而我使用自带的IE控件却发现了不少缺点,这也是duilib一直 ...

  6. 给Webkit内核的浏览器控件增加互交功能

    转载请说明出处,谢谢~~ 昨天封装了基于webkit的wke浏览器内核,做成了duilib的浏览器控件,实现了浏览功能,但是单单的浏览功能还不满足需求,在我的仿酷狗项目中乐库的功能需要与浏览器互交. ...

  7. 将VLC库封装为duilib的万能视频播放控件

    转载请说明出处,谢谢~~ 昨天封装好了基于webkit的浏览器控件,修复了duilib的浏览器功能的不足,而我的仿酷狗播放器项目中不光需要浏览器,同时也需要视频播放功能,也就是完成MV的功能.所以我打 ...

  8. CEF中文教程&lpar;google chrome浏览器控件&rpar; -- Windows下编译Chromium

    CEF中文教程(google chrome浏览器控件) -- CEF简介 2013-04-10 16:48 42928人阅读 评论(4) 收藏 举报  分类: CEF(2)    目录(?)[+]   ...

  9. duilib进阶教程 -- TreeView控件的bug &lpar;9&rpar;

    一.不自动调整子控件的宽度(TreeView宽度小于260时) 相信亲们用同样的代码,显示效果肯定和Alberl不一样吧~O(∩_∩)O~ 嘿嘿,仔细对比下,看看你们的列表头背景图片是下面这样的么? ...

随机推荐

  1. 如何通过源生js获取一个元素的具体样式值 &sol;&ast; getCss:获取指定元素的具体样式的属性值 curElement&colon;&lbrack;dom对象&rsqb; attr&colon;&lbrack;string&rsqb; &ast;&sol;

    昨天的博客些的真的是惨不忍睹啊!!!但是我的人生宗旨就是将不要脸的精神进行到底,所以,今天我又来了.哈哈哈哈哈! 方法一:元素.style.属性名:(这个有局限性--只能获取行内样式的值,对于样式表或 ...

  2. 纯JS实现俄罗斯方块,打造属于你的游戏帝国

    纯JS俄罗斯方块,打造属于你的游戏帝国. 本文原始作者博客 http://www.cnblogs.com/toutou 俄罗斯方块(Tetris, 俄文:Тетрис)是一款电视游戏机和掌上游戏机游戏 ...

  3. monkey之三:monkey测试测略(摘抄)

    一.分类 Monkey测试针对不同的对象,不同的目的,采用不同的测略方案. 测试类型分为: 应用程序的稳定性测试和压力测试 测试对象分为: 单个APK和多个APK集合 测试目的分为: 解决问题的测试( ...

  4. 通过Nginx&plus;tomcat&plus;redis实现反向代理 、负载均衡及session同步

    一直对于负载均衡比较陌生,今天尝试着去了解了一下,并做了一个小的实验,对于这个概念有一些认识,在此做一个简单的总结 什么是负载均衡 负载均衡,英文 名称为Load Balance,指由多台服务器以对称 ...

  5. django中抽象基类的Foreignkey的定义

    class base(models.Model): user = models.ForeignKey(User) class Meta: abstract =True 以上是抽象基类的定义,只有一个公 ...

  6. 深度学习笔记------linux下配置安装caffe-cpu only模式

    本文适合初学者学习配置caffe的最简单方法.这是我在看了网上各种大神的方法后总结的最傻瓜式的配置方法了. 本人也是在不断地配置caffe过程中受打击与成长@.@ 第一步.配置caffe所需的依赖环境 ...

  7. Java实现 Base64、MD5、MAC、HMAC加密&lpar;转&rpar;

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... packa ...

  8. jQuery克隆DOM节点

    jQuery克隆DOM节点 <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  9. 使用 Flask-Docs 自动生成 Api 文档

    影响我写文档的原因可能是代码和文档分离,有时候写完代码会忘记补文档,而且不能及时查看,使用 Flask-Docs 可以解决我的问题,这个插件可以根据代码注释生成文档页面,代码注释改动文档可以及时更新, ...

  10. 准备下上机考试,各种排序!!以后再添加和仿真像wiki上那样!

    #include <stdio.h> #include <string.h> #define N 6 typedef struct { ]; int score; }stude ...