定制 WebBrowser 控件
發(fā)表時間:2023-08-18 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]因為工作需要,這幾天在尋找定制 WebBrowser 控件的方法。原來已經(jīng)研究過一陣子,原理大概知道,基本就是實現(xiàn) IDocHostUIHandler 和 IDocHostShowUI 兩個接口,I...
因為工作需要,這幾天在尋找定制 WebBrowser 控件的方法。原來已經(jīng)研究過一陣子,原理大概知道,
基本就是實現(xiàn) IDocHostUIHandler 和 IDocHostShowUI 兩個接口,IE 控件會在適當(dāng)?shù)臅r候調(diào)用這兩個接口,
我只要按照幫助文檔的說明設(shè)置不同的值就可以了。
掛接這兩個接口接口到控件中去,有兩種方法:
一種是通過 ICustomDoc 接口定制,代碼如下:
html0.Navigate2("about:blank");
ICustomDoc o = html0.Document as ICustomDoc;
o.SetUIHandler(this as IDocHostUIHandler);
但是因為只有文檔裝入之后才可以取得Document的值,所以需要預(yù)先裝入一個空文檔,這里是about:blank。
第二種方法是完成 Active Document Host 所需要的所有接口
, IOleClientSite
, IOleInPlaceSite
, IOleDocumentSite
//, IOleWindow // IOleInPlaceSite 已經(jīng)包含了該接口
, IDocHostUIHandler
, IDocHostShowUI
// IOleInPlaceSite.GetWindowContext 調(diào)用需要以下兩個接口
, IOleInPlaceFrame
//, IOleInPlaceUIWindow // IOleInPlaceFrame 已經(jīng)實現(xiàn)了該接口
// 接口 IOleClientSite.GetContainor 需要用到
, IOleContainer
掛接這些接口到控件中的代碼如下:
IOleObject o = html0.GetOcx() as IOleObject;
o.SetClientSite(this as IOleClientSite);
一旦掛接成功之后,一般會調(diào)用如下幾個函數(shù)
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 就是用的這種方法,可惜我沒能做成。