如何简单完成定制 WebBrowser 控件

发表于:2007-06-21来源:作者:点击数: 标签:
因为工作需要,这几天在寻找定制 WebBrowser 控件的方法。原来已经研究过一阵子,原理大概知道, 基本就是实现 IDocHostUIHandler 和 IDocHostShowUI 两个接口,IE 控件会在适当的时候调用这两个接口, 我只要按照帮助文档的说明设置不同的值就可以了。 挂接

   
  因为工作需要,这几天在寻找定制 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 TranslateAclearcase/" target="_blank" >ccelerator
  IDocHostUIHandler TranslateUrl
  IDocHostUIHandler ShowContextMenu
  IDocHostShowUI IDocHostShowUI
  IOleClientSite GetContainer
  
  另外还有一种方法,就是直接使用文档嵌入功能,嵌入 HTMLDocument 对象,这样可以省却使用 WebBrowser 控件。HtmlEditor 就是用的这种方法,可惜我没能做成。

原文转自:http://www.ltesting.net