因为工作需要,这几天在寻找定制 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 就是用的这种方法,可惜我没能做成。