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

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

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

  1. #ifndef _CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_
  2. #define _CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_
  3.  
  4. #pragma once
  5. class CCustomWebEventHandler:public CWebBrowserEventHandler
  6. {
  7. public:
  8. CCustomWebEventHandler() {}
  9. ~CCustomWebEventHandler() {}
  10.  
  11. virtual void BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel ) {}
  12. virtual void NavigateError(IDispatch *pDisp,VARIANT * &url,VARIANT *&TargetFrameName,VARIANT *&StatusCode,VARIANT_BOOL *&Cancel) {}
  13. virtual void NavigateComplete2(IDispatch *pDisp,VARIANT *&url){ }
  14.  
  15. virtual void ProgressChange(LONG nProgress, LONG nProgressMax){}
  16. virtual void NewWindow3(IDispatch **pDisp, VARIANT_BOOL *&Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl){}
  17. virtual void CommandStateChange(long Command,VARIANT_BOOL Enable){}
  18.  
  19. // interface IDocHostUIHandler
  20. virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(
  21. /* [in] */ DWORD dwID,
  22. /* [in] */ POINT __RPC_FAR *ppt,
  23. /* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
  24. /* [in] */ IDispatch __RPC_FAR *pdispReserved)
  25. {
  26. return S_OK;
  27. //return S_FALSE
  28. }
  29.  
  30. virtual HRESULT STDMETHODCALLTYPE GetHostInfo(
  31. /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo)
  32. {
  33. if (pInfo != NULL)
  34. {
  35. pInfo->cbSize = sizeof(DOCHOSTUIINFO);
  36. pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
  37. pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME |
  38. DOCHOSTUIFLAG_NO3DOUTERBORDER | DOCHOSTUIFLAG_DIALOG |
  39. DOCHOSTUIFLAG_DISABLE_HELP_MENU;//| DOCHOSTUIFLAG_SCROLL_NO;;
  40.  
  41. //这里还可以加其他代码来控制网页
  42. //LPWSTR m_pZoom = L"BODY{Zoom:100%;}";
  43. //pInfo->pchHostCss = (LPWSTR)::CoTaskMemAlloc((lstrlenW(m_pZoom)+1)*2);
  44. //lstrcpyW(pInfo->pchHostCss, m_pZoom);
  45. }
  46.  
  47. return S_OK;
  48.  
  49. }
  50.  
  51. virtual HRESULT STDMETHODCALLTYPE ShowUI(
  52. /* [in] */ DWORD dwID,
  53. /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,
  54. /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,
  55. /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,
  56. /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc)
  57. {
  58. return S_FALSE;
  59. }
  60.  
  61. virtual HRESULT STDMETHODCALLTYPE HideUI( void)
  62. {
  63. return S_OK;
  64. }
  65.  
  66. virtual HRESULT STDMETHODCALLTYPE UpdateUI( void)
  67. {
  68. return S_OK;
  69. }
  70.  
  71. virtual HRESULT STDMETHODCALLTYPE EnableModeless(
  72. /* [in] */ BOOL fEnable)
  73. {
  74. return S_OK;
  75. }
  76.  
  77. virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate(
  78. /* [in] */ BOOL fActivate)
  79. {
  80. return S_OK;
  81. }
  82.  
  83. virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(
  84. /* [in] */ BOOL fActivate)
  85. {
  86. return S_OK;
  87. }
  88.  
  89. virtual HRESULT STDMETHODCALLTYPE ResizeBorder(
  90. /* [in] */ LPCRECT prcBorder,
  91. /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
  92. /* [in] */ BOOL fRameWindow)
  93. {
  94. return S_OK;
  95. }
  96.  
  97. virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(
  98. /* [in] */ LPMSG lpMsg,
  99. /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
  100. /* [in] */ DWORD nCmdID)
  101. {
  102. return S_OK;
  103. }
  104.  
  105. virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath(
  106. /* [out] */ LPOLESTR __RPC_FAR *pchKey,
  107. /* [in] */ DWORD dw)
  108. {
  109. return S_OK;
  110. }
  111.  
  112. virtual HRESULT STDMETHODCALLTYPE GetDropTarget(
  113. /* [in] */ IDropTarget __RPC_FAR *pDropTarget,
  114. /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)
  115. {
  116. return S_OK;
  117. }
  118.  
  119. virtual HRESULT STDMETHODCALLTYPE GetExternal(
  120. /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
  121. {
  122. return S_OK;
  123. }
  124.  
  125. virtual HRESULT STDMETHODCALLTYPE TranslateUrl(
  126. /* [in] */ DWORD dwTranslate,
  127. /* [in] */ OLECHAR __RPC_FAR *pchURLIn,
  128. /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)
  129. {
  130. return S_OK;
  131. }
  132.  
  133. virtual HRESULT STDMETHODCALLTYPE FilterDataObject(
  134. /* [in] */ IDataObject __RPC_FAR *pDO,
  135. /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)
  136. {
  137. return S_OK;
  138. }
  139.  
  140. // virtual HRESULT STDMETHODCALLTYPE GetOverrideKeyPath(
  141. // /* [annotation][out] */
  142. // __deref_out LPOLESTR *pchKey,
  143. // /* [in] */ DWORD dw)
  144. // {
  145. // return E_NOTIMPL;
  146. // }
  147.  
  148. // IDownloadManager
  149. virtual HRESULT STDMETHODCALLTYPE Download(
  150. /* [in] */ IMoniker *pmk,
  151. /* [in] */ IBindCtx *pbc,
  152. /* [in] */ DWORD dwBindVerb,
  153. /* [in] */ LONG grfBINDF,
  154. /* [in] */ BINDINFO *pBindInfo,
  155. /* [in] */ LPCOLESTR pszHeaders,
  156. /* [in] */ LPCOLESTR pszRedir,
  157. /* [in] */ UINT uiCP)
  158. {
  159. return S_OK;
  160. }
  161. };
  162.  
  163. #endif //_CCUSTOM_WEBBROWSER_EVENT_HANDLER_H_

使用他的方法如下:

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

  1. CWebBrowserUI* pActiveXUI = static_cast<CWebBrowserUI*>(m_PaintManager.FindControl(_T("ActiveXDemo1")));
  2.  
  3. if( pActiveXUI )
  4. {
  5. pActiveXUI->SetDelayCreate(false);
  6. CCustomWebEventHandler *pWebHandle = new CCustomWebEventHandler;
  7. pActiveXUI->SetWebBrowserEventHandler(pWebHandle);
  8. pActiveXUI->Navigate2(L"about:blank"); //这行代码,如果注释掉,就不会去掉边框,IE有bug,第二次加载网页才会让事件处理器有效
  9. pActiveXUI->Navigate2(L"http://www.kugou.com/");
  10. }

我这里强调两点

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

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

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

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

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

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

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

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

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

  4. java浏览器控件jxbrowser(简单demo模拟自动登录与点击)

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

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

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

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

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

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

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

  8. CEF中文教程(google chrome浏览器控件) -- Windows下编译Chromium

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

  9. duilib进阶教程 -- TreeView控件的bug (9)

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

随机推荐

  1. RecyclerView+CardView简单使用

    RecyclerView取代Listview用来显示数据,除此之外还能实现瀑布流的布局.CardView让我们的界面更好看,此外还将使用官方的下拉刷新. 添加支持: compile 'com.andr ...

  2. NET 命名规范

    1 ADO.NET 命名规范 数据类型 数据类型简写 标准命名举例 Connection con conNorthwind Command cmd cmdReturnProducts Paramete ...

  3. Hbase split的三种方式和split的过程

    在Hbase中split是一个很重要的功能,Hbase是通过把数据分配到一定数量的region来达到负载均衡的.一个table会被分配到一个或多个region中,这些region会被分配到一个或者多个 ...

  4. 基于QT的webkit与ExtJs开发CB/S结构的企业应用管理系统

      一:源起       1.何为CB/S的应用程序       C/S结构的应用程序,是客户端/服务端形式的应用程序,这种应用程序要在客户电脑上安装一个程序,客户使用这个程序与服务端通信,完成一定的 ...

  5. HTML5 Canvas实现黑客帝国文字掉落效果

    效果: 原理: 用canvas逐行输出文字,然后让背景颜色逐渐加深,再随机中断某些列. 代码: HTML: <canvas id="c"></canvas> ...

  6. CLIQUE 聚类算法以及Java实现+多线程

    CLIQUE(Clustering In QUEst)是一种简单的基于网格的聚类方法,用于发现子空间中基于密度的簇.CLIQUE把每个维划分成不重叠的区间,从而把数据对象的整个嵌入空间划分成单元.它使 ...

  7. SSL双向认证java实现(转)

    本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...

  8. 【原】在windows下使用VirtualEnv

    VirtualEnv可以方便的解决不同项目中对类库的依赖问题.这通常是通过以下方式实现的:首先将常用的类库安装在系统环境中:然后为每个项目安装独立的类库环境.这样子可以保证每个项目都运行在独立的类库环 ...

  9. 集合使用copy与mutableCopy的区别

    集合(NSArray,NSSet,NSDictionary等)使用copy与mutableCopy的区别是类似的,下面以NSMutableArray.NSArray 为例子验证如下: NSMutabl ...

  10. 【仅支持移动设备】Swipe.JS轻量级移动幻灯效果

    在线演示 本地下载 请使用手机直接访问地址: 单独页面展示效果