自定义浏览器控件

Qt/C++编写自定义控件36-图片浏览器 一、前言 本控件主要用来作为一个简单的图片浏览器使用,可以上下翻页显示图片,图片还可以开启过度效果比如透明度渐变,应用场景有查看报警图片运行图片等。此控件非本人原创,来源于网络,我只是修正了好多处BUG,并完善了各种操作方式。比如增加鼠标右键清空、增加背景色、增加键盘翻页、增加移动到第一张/末一张/上一张/下一张 等, 控件没有什么难度,主要就是打开文件夹,自动计算文件夹下的所有文件存储到队列中,... 阅读详情

同自动化浏览器相比,自动化浏览器控件(WebBrowser Control) 在应用程序中更加常用。从Outlook的预览窗格到Maxthon这样的基于IE引擎的浏览器,从无界面的HTML分析器到Norton Antivirusd的主界面,浏览器控件在众多领域被用作各种各样的用途。这也使得有必要根据具体的用户需求自定义浏览器控件的行为。

在应用程序中加入浏览器控件

集成浏览器控件的最简单的方法是找一个支持ActiveX的集成开发环境,在工具箱中加入Microsoft Web Browser这个控件,往表单上拖一个这个控件就可以完成工作。你甚至可以用集成开发环境添加ActiveX的事件处理函数。如果要直接导入ActiveX的话,建议使用mehrcpp的vbMHWB控件(http://www.codeproject.com/atl/vbmhwb.asp)。这个控件在浏览器控件的基础上进行了扩展,暴露了很多底层接口。

通常导入ActiveX就可以满足大部分需求  ,但是有些类库中也集成了浏览器控件,并且提供了更多的功能,例如MFC的CHTMLView和CDHtmlDialog,ATL的HTML Control,以及.Net 2.0中的Windows.Forms.WebBrowser。如果使用Visual C++来进行非托管编程,那么建议使用MFC或者ATL的封装类,或者使用vbMHWB控件。托管编程中当然首选Windows.Forms.WebBrowser。除非这些类的BUG影响到了应用程序的开发,否则建议使用这些功能更加强大的封装类。

在使用浏览器控件及其封装类的时候要注意一些已知问题

常见任务

在集成浏览器控件之后,可以完成基本的网页浏览,但是对于不同的任务,也需要进一步的处理,例如设置控件的属性、为控件添加事件处理、操作HTML文档等等。

修改浏览器控件的属性

这在集成开发环境中可以很容易地设置,也可以自己实现容器来设置,但是CHTMLView这样的封装类没有这个选项(http://support.microsoft.com/kb/197921)。

  • 链接目标解析。对于用浏览器控件来做浏览器的场合来说,需要将浏览器的RegisterAsBrowser属性设置为true。这使得Internet Explorer在解析HTML链接的target属性指定的目标窗口时可以找到这个窗口。
  • 禁用拖放。对于使用浏览器控件来做预览窗格的场合来说,需要将浏览器的RegisterAsDropTarget属性设置为false。这使得窗口不接受拖进来的文件和链接。
  • 禁用消息框。对于用浏览器控件来做HTML分析器的场合来说,有时需要屏蔽脚本产生的消息框以避免阻塞程序运行。这可以通过设置浏览器的Silent属性来实现,或者实现IDocHostShowUI::ShowMessage。

捕获浏览器控件的事件

集成开发环境中可以也很容易地添加浏览器的事件处理函数。比较常用的事件包括

  • NewWindow2或者NewWindow3事件。默认情况下,浏览器控件中创建的新窗口会是一个Internet Explorer的窗口。这通常不是预期的行为,对于浏览器程序来说更是这样。需要处理浏览器的NewWindow2或者NewWindow3(在Windows XP SP2或者Windows 2003 SP1之后可用)事件来让新的浏览器窗口在应用程序提供的窗口中运行。
  • WindowClosing事件。浏览器控件需要处理WindowClosing事件来在浏览器控件被脚本关闭时关闭浏览器控件的宿主窗口(http://support.microsoft.com/kb/253219)。
  • BeforeNavigate2事件。可以在自己的网页中加入自定义的协议,之后在BeforeNavigate2事件中扫描URL来进行网页和应用程序之间的交互(http://www.microsoft.com/msj/0100/c/c0100.aspx)。当然,自定义的网络协议也可以用Asynchronous Pluggable Protocol来处理(参见http://support.microsoft.com/kb/303740),vbMHWB控件就实现了这个功能。但是更加常用的是在弹出广告过滤器程序中用BeforeNavigate2来判断在NewWindow2事件中创建的窗口是否需要关闭。

操作MSHTML文档

通常HTML分析和浏览器自动化程序都需要分析网页的结构,找到需要操作的元素。这需要对网页的结构进行分析,找到目标元素的标识方法。 一些常用的操作包括:

 在页面包含框架的时候,可能需要跨框架访问HTML文档。可以通过查询框架元素所支持的IWebBrowser2接口或者IHTMLWindow2接口来访问框架中的文档(http://support.microsoft.com/kb/196340),但是也有可能因为安全设置而无法访问(http://support.microsoft.com/kb/167796)。

在浏览器控件中显示其它类型的文档时,可以用IWebBrowser2的document属性来访问ActiveX文档,例如在显示Microsoft Word时,IWebBrowser2的document属性就是Word的文档对象,在显示文件夹的时候,IWebBrowser2的document属性就是文件夹对象等等。

扩展浏览器的宿主

浏览器控件在创建时会查询ActiveX容器的IOleClientSite的实现的如下接口:IDocHostUIHandler, IDocHostUIHandler2 and IDocHostShowUI

虽然在无法自定义ActiveX容器的情况下可以用ICustomDoc::SetUIHandler来挂接IDocHostUIHandler到浏览器控件,但是这样也会造成内存泄漏(http://support.microsoft.com/kb/893629)。一些类库,例如MFC、ATL和.Net类库都实现了IDocHostUIHandler接口。

除了专门用于浏览器用途的程序之外,通常都需要自定义浏览器控件的上下文菜单。这需要实现IDocHostUIHandler::ShowContextMenu。通常的实现包括完全禁用上下文菜单、完全替换上下文菜单、以及修改部分上下文菜单。经常被从上下文菜单中移除的菜单项包含查看源代码、刷新和属性。一种替代的方案是在容器中过滤右键消息(http://support.microsoft.com/kb/231578)。

与浏览器相比,一些Internet Explorer的宿主功能在浏览器控件中并不是默认启用。在某些场合,默认启用的宿主功能可能并非预期。这时需要实现IDocHostUIHandler::GetHostInfo。可以通过实现IDocHostUIHandler::GetHostInfo来自定义的功能包括:

  • 自动完成功能。对于用浏览器控件来做浏览器的场合来说,这个功能是有必要启用的。启用的方法是设置DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE位
  • 如果浏览器中的链接网址包含非ASCII的字符,那么需要实现IDocHostUIHandler::GetHostInfo,并且在返回的DOCHOSTUIINFO结构中设置dwFlags成员的DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8位。这使得网址会在发送之前用UTF-8编码。
  • 3D边框、滚动条,禁用文字选择功能和禁用页面上的脚本。
  • 对于使用浏览器控件来做HTML编辑器的场合来说,有时需要修改默认的页面样式。这都需要实现IDocHostUIHandler::GetHostInfo(http://support.microsoft.com/kb/328803)。注意在有些版本的IE中IDocHostUIHandler::GetHostInfo只在MSHTML被初始化的时候被调用,所以如果你需要在MSHTML被初始化之后使你的修改生效,你需要浏览到一个Word之类的非HTML Active document文档,之后再浏览回来。

在使用浏览器控件来做数据录入界面的场合,需要更改浏览器控件默认的Tab键处理使得用户可以使用Tab键切换到容器中的其他控件。这需要实现IDocHostUIHandler::TranslateAccelerator来自定义浏览器控件的快捷键处理。对于MFC这样用消息钩子来做消息预处理的可自定义容器来说,也可以用PreTranslateMessage来过滤F5键盘消息,而不是实现IDocHostUIHandler::TranslateAccelerator。

在脚本中调用应用程序对浏览器控件的扩展,这需要实现IDocHostUIHandler::GetExternal。使用.Net的WebBrowser控件的话设置ObjectForScripting属性就可以了。

对于用浏览器控件来做HTML分析器的场合来说,有时需要屏蔽脚本产生的消息框。这需要实现IDocHostShowUI::ShowMessage,或者设置浏览器的Silent属性。

另外,浏览器也会查询IOleClientSite来获得其它的服务信息,例如

其他控制

对于用浏览器控件来做HTML分析器的场合来说,有时需要禁用浏览器的脚本、ActiveX或者图片下载。这可以通过在容器中实现IDispatch,处理DISPID_AMBIENT_DLCONTROL来做到(http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/overview/Overview.asp)。

看来离线浏览的控制并不能用这种方法来控制(http://support.microsoft.com/kb/247336)。不过你可以自己编写一个HTTP层传递 BINDF_OFFLINEOPERATION标志 (http://groups-beta.google.com/group/microsoft.public.inetsdk.programming.mshtml_hosting/msg/76bf4910a289d4b3

在浏览器控件中java小程序可能不能正常运行,如果使用Sun JVM1.4之后的版本,可以用SetEnvironmentVariable 来设置JAVA_PLUGIN_WEBCONTROL_ENABLE为1来启用Sun JVM。

默认情况下在页面载入时会有点击声。屏蔽点击声的一个方法是在程序运行时修改注册表键(http://support.microsoft.com/kb/201901),另一个方法是将浏览器控件隐藏,在调用Navigate2之后再显示,但是这也需要锁定控件的更新区域(LockWindowUpdate)以避免闪烁。在IE7中,也可以调用 CoInternetSetFeatureEnabled函数,传递FEATURE_DISABLE_NAVIGATION_SOUNDS来禁用浏览时的声音。

在需要使用代理服务器时,有可能需要在应用程序中使用非默认的代理服务器设置。这可以通过调用UrlMkSetSessionOption来实现。

52、模板、自定义控件浏览器集成技术解析 本文深入解析了FlipPanel自定义控件的使用方法,包括添加控件实例、实现翻转功能以及通过模板定制外观和动画效果。同时探讨了Silverlight与HTML页面集成的原因及策略,详细介绍了与HTML元素交互的关键类和操作方法,如获取浏览器信息、导航、弹出窗口以及检查HTML文档结构。最后总结了交互过程中的注意事项,并展望了未来技术的发展方向。 阅读详情

相关推荐

51、模板、自定义控件浏览器集成全解析

本文深入解析了模板与自定义控件的开发实践,重点介绍了如何通过模板绑定、状态动画和自定义切换按钮来创建灵活可定制的FlipPanel控件。同时,探讨了Silverlight与HTML页面的集成方式,包括与HTML元素的交互、JavaScript互操作以及页面布局重叠问题的处理,为构建富客户端与网页融合的应用提供了全面的技术指导。

tcp8optimizer的博客 69

cspace-public-browser.js

cspace-公共浏览器 CollectionSpace公共浏览器。 安装 对于CollectionSpace管理员 CollectionSpace公共浏览器是在Web浏览器中运行JavaScript应用程序。 要将应用程序安装在WordPress站点中,请使用 WordPress插件。 对于CollectionSpace开发人员 14和npm 6来构建应用程序。 要下载并安装用于开发的应用程序的源代码,请执行以下操作: git clone https://github.com/collectionspace/cspace-public-browser.js.git cd cspace-public-browser.js npm install 在开发过程中运行应用程序: cd cspace-public-browser.js npm run devserver 然后打开浏览器

基于WebBrowser控件的可扩展自定义浏览器开发项目

在构建一个功能完整、可扩展性强的自定义桌面浏览器应用时,合理的项目初始化流程和清晰的架构设计是决定后期维护效率与系统稳定性的关键。本章将围绕基于 Windows Forms 的 WebBrowser 控件封装展开,从应用程序创建、模块集成到整体分层结构组织进行深入剖析。通过科学地划分职责边界、引入配置管理机制并整合核心类库,为后续实现高级功能(如导航控制、脚本通信、安全策略等)打下坚实基础。默认情况下,WebBrowser控件继承IE的右键菜单,包含“查看源代码”、“在新标签页打开链接”等功能。

weixin_35390379的博客 1254

浏览器browser.html.zip

browser.html 是一个在 HTML 上搭建的浏览器。它是一个与 Servo 相关的平台研究项目,但它并不是一款产品。 标签:browser 分享 window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "2", "bdMiniList": [], "bdPic": "", "bdStyle": "1", "bdSize": "24" }, "share": {} }; with (document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' ~(-new Date() / 36e5)];\r\n \r\n \r\n \r\n \r\n \u8f6f\u4ef6\u9996\u9875\r\n \u8f6f\u4ef6\u4e0b\u8f7d\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\nwindow.changyan.api.config({\r\nappid: 'cysXjLKDf', conf: 'prod_33c27aefa42004c9b2c12a759c851039' });

webbrowser控件属性介绍

该组件是一个浏览器组件,可以显示一个指定地址的网页、设置网页打开时的主页以及对网页进行相关的操作,同时也可以对HTML文件进行剪切、复制、粘贴、删除等操作。该 组件在Internet组件页中。 1.属性 (1)AddressBar属性 设置是否显示地址栏,在TWebBrowser中没有用。 语法: property AddressBar: WordBool; (2)Busy属性 确

wayaoqiang的专栏 9877

(转贴)自定义浏览器控件

自定义浏览器控件 同自动化浏览器(http://blog.joycode.com/jiangsheng/archive/2005/10/20/65489.aspx)相比,自动化浏览器控件(WebBrowser Control) 在应用程序中更加常用。从Outlook的预览窗格到Maxthon这样的基于IE引擎的浏览器,从无界面的HTML分析器到Norton Antivirusd的主界面,浏

JonnyLai 1637

GetRegisterAsBrowser CHtmlView::GetRegisterAsBrowser

无语,查了半天,没有太多资料。 Call this member function to determine whether the WebBrowser object is registered as a top-level browser for target name r

小发猫 1025

WebBrowser 中不显示 java小程序 Applet

网页中有一个 java小程序 [不懂java 也许叫这个名字] 用ie 或者 世界之窗 可以正常使用 这个页面 内容完整 使用 WebBrowser 打开以后就 WebBrowser java小程序的位置就会显示为 一个灰色的 矩形【本来是有内容的】 打开页面过程中 会提示错误 *****为空或不是对象  解决方法 增加环境变量JAVA_PLUGIN_WEBCONTROL_ENABLE

飞龙在天 2156

ICustomDoc和IDocHostUIHandler应用

IDocHostUIHandler是IE暴露的一个不完全的界面取代接口,通过ICstomDoc的设置来确定IE界面的显示结果。       要点主要如下:         1。首先引入:ICustomDoc的头Mshtmhst.h(如若没有:一直提示找不到ICustomDoc标示符)              class   TDocHostUIHandlerImpl   :   publi

tangyanzhi1111的专栏 2876

Qt编写自定义控件36-图片浏览器

一、前言 本控件主要用来作为一个简单的图片浏览器使用,可以上下翻页显示图片,图片还可以开启过度效果比如透明度渐变,应用场景有查看报警图片运行图片等。此控件非本人原创,来源于网络,我只是修正了好多处BUG,并完善了各种操作方式。比如增加鼠标右键清空、增加背景色、增加键盘翻页、增加移动到第一张/末一张/上一张/下一张 等, 控件没有什么难度,主要就是打开文件夹,自动计算文件夹下的所有文件存储...

weixin_30265171的博客 153

【Android界面实现】自定义Gallery控件实现简单3D图片浏览器

本篇文章主要介绍如何使用自定义的Gallery控件,实现

赵凯强 3884

自定义控件实现uc浏览器语音搜索效果

最近项目上要实现语音搜索功能,界面样式要模仿一下UC浏览器的样式,UC浏览器中有一个控件,会随着声音大小浮动,然后寻思偷个懒,百度一下,结果也没有找到类似的,只能自己动手了。 先上图看我实现的效果: 这是自定义控件的代码,里面注释也很明白,就不费话了 public class CustomCircleView extends View{ private Paint m

ludi的博客 645

[备忘]自定义IE浏览器控件

英文原文:http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/wbcustomization.asp译文出处:http://dev.csdn.net/article/19/19627.shtm 自定义浏览器本教程提供了自定义浏览器控件的行为和外观的一些方法。你将看到高级的宿主接口,IDo

在路上 2603
上一篇: 先懂事还是先上网?
下一篇: 创建和自动化Internet Explorer和资源管理器窗口
sumuch
博客等级 码龄21年 3粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值