注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

写着玩

Bob

 
 
 

日志

 
 
 
 

如何简单完成定制 WebBrowser 控件  

2010-02-25 19:10:54|  分类: 浏览器 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://server.chinabyte.com/389/2568889.shtml

 因为工作需要,这几天在寻找定制 WebBrowser 控件的方法。原来已经研究过一阵子,原理大概知道,

  基本就是实现 IDocHostUIHandler 和 IDocHostShowUI 两个接口,IE 控件会在适当的时候调用这两个接口,

  我只要按照帮助文档的说明设置不同的值就可以了。

  挂接这两个接口接口到控件中去,有两种方法:

  一种是通过 ICustomDoc 接口定制,代码如下:

  html0.Navigate2("about:blank");

  ICustomDoc o = html0.Document as ICustomDoc;

  o.SetUIHandler(this as IDocHostUIHandler);

  但是因为只有文档装入之后才可以取得Document的值,所以需要预先装入一个空文档,这里是about:blank。

  第二种方法是完成 Active Document Host 所需要的所有接口

  , IOleClientSite

  , IOleInPlaceSite

  , IOleDocumentSite

  //, IOleWindow    // IOleInPlaceSite 已经包含了该接口

  , IDocHostUIHandler

  , IDocHostShowUI

  // IOleInPlaceSite.GetWindowContext 调用需要以下两个接口

  , IOleInPlaceFrame

  //, IOleInPlaceUIWindow // IOleInPlaceFrame 已经实现了该接口

  // 接口 IOleClientSite.GetContainor 需要用到

  , IOleContainer

  挂接这些接口到控件中的代码如下:

  IOleObject o = html0.GetOcx() as IOleObject;

  o.SetClientSite(this as IOleClientSite);

  一旦挂接成功之后,一般会调用如下几个函数

  IOleInPlaceSite GetWindow

  IDocHostUIHandler GetHostInfo

  IDocHostUIHandler GetOptionKeyPath

  IDocHostUIHandler GetHostInfo

  IDocHostUIHandler GetDropTarget

  IDocHostUIHandler UpdateUI

  IDocHostUIHandler ShowUI

  IDocHostUIHandler HideUI

  IDocHostUIHandler TranslateAccelerator

  IDocHostUIHandler TranslateUrl

  IDocHostUIHandler ShowContextMenu

  IDocHostShowUI IDocHostShowUI

  IOleClientSite GetContainer

  另外还有一种方法,就是直接使用文档嵌入功能,嵌入 HTMLDocument 对象,这样可以省却使用 WebBrowser 控件。HtmlEditor 就是用的这种方法,可惜我没能做成。

  因为工作需要,这几天在寻找定制 WebBrowser 控件的方法。原来已经研究过一阵子,原理大概知道,

  基本就是实现 IDocHostUIHandler 和 IDocHostShowUI 两个接口,IE 控件会在适当的时候调用这两个接口,

  我只要按照帮助文档的说明设置不同的值就可以了。

  挂接这两个接口接口到控件中去,有两种方法:

  一种是通过 ICustomDoc 接口定制,代码如下:

  html0.Navigate2("about:blank");

  ICustomDoc o = html0.Document as ICustomDoc;

  o.SetUIHandler(this as IDocHostUIHandler);

  但是因为只有文档装入之后才可以取得Document的值,所以需要预先装入一个空文档,这里是about:blank。

  第二种方法是完成 Active Document Host 所需要的所有接口

  , IOleClientSite

  , IOleInPlaceSite

  , IOleDocumentSite

  //, IOleWindow    // IOleInPlaceSite 已经包含了该接口

  , IDocHostUIHandler

  , IDocHostShowUI

  // IOleInPlaceSite.GetWindowContext 调用需要以下两个接口

  , IOleInPlaceFrame

  //, IOleInPlaceUIWindow // IOleInPlaceFrame 已经实现了该接口

  // 接口 IOleClientSite.GetContainor 需要用到

  , IOleContainer

  挂接这些接口到控件中的代码如下:

  IOleObject o = html0.GetOcx() as IOleObject;

  o.SetClientSite(this as IOleClientSite);

  一旦挂接成功之后,一般会调用如下几个函数

  IOleInPlaceSite GetWindow

  IDocHostUIHandler GetHostInfo

  IDocHostUIHandler GetOptionKeyPath

  IDocHostUIHandler GetHostInfo

  IDocHostUIHandler GetDropTarget

  IDocHostUIHandler UpdateUI

  IDocHostUIHandler ShowUI

  IDocHostUIHandler HideUI

  IDocHostUIHandler TranslateAccelerator

  IDocHostUIHandler TranslateUrl

  IDocHostUIHandler ShowContextMenu

  IDocHostShowUI IDocHostShowUI

  IOleClientSite GetContainer

  另外还有一种方法,就是直接使用文档嵌入功能,嵌入 HTMLDocument 对象,这样可以省却使用 WebBrowser 控件。HtmlEditor 就是用的这种方法,可惜我没能做成。

  评论这张
 
阅读(483)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017