一、簡介
大家都知道,目前比較流行的網絡浏覽器如Mozilla FireFox以及MyIE2等都具有多頁面浏覽功能,每打開一個新的頁面都自動產生一個新的選項卡頁面,頁面的關閉也十分簡便。這種設計思想使得用戶在浏覽多個網頁時桌面十分簡潔,也避免了用戶等待單頁面顯示的苦惱。由於這些浏覽器一般都支持操作多種文件格式,所以當浏覽本地機器上的多個文件時也極為方便。
本文使用Visual C#詳細介紹如何實現這種多頁面浏覽功能。同時,還實現了下面附加功能: 打印, 打印預覽,頁面屬性,選項,查找,查看頁面源文件等。
二、關鍵技術分析
解決問題的關鍵在於對浏覽器控件WebBrowser的NewWindow2事件的編程。當需要顯示某種文件而生成一個新窗口時,NewWindow2 事件即被激活。注意,該事件發生在WebBrowser控件的新窗口產生之前。例如,作為對導航到一個新窗口或者一個腳本控制的window.open方法的響應,即發生該事件。為了聲明當一個新窗口被打開時,將使用我們自己的浏覽器程序,應該把參數ppDisp置為Application 對象。此時,如果你選擇“在新窗口中打開”,則新產生一個窗口來顯示Web頁面。你也可以把RegisterAsBrowser設置為TRUE,這將導致新生成的WebBrowser控件參與到窗口命名的沖突問題上。例如,如果一個窗口的名字在腳本的另外一處用到,那麼該控件被派上用場,而不是再產生一個新的窗口,因為控件在打開一個新的窗口之前先檢查一下所有已存在的窗口名稱以避免命名沖突。 在本文示例中,作為對該事件的響應,我們動態地創建一個tab頁面,並通過調用CreateNewWebBrowser()方法產生一個WebBrowser控件作為其子控件――這裡每一個子控件都有一個包含該控件相關信息的tag屬性。詳見下面的源碼:
private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e) { AxSHDocVw.AxWebBrowser _axWebBrowser = CreateNewWebBrowser(); e.ppDisp = _axWebBrowser.Application; _axWebBrowser.RegisterAsBrowser = true; } private AxSHDocVw.AxWebBrowser CreateNewWebBrowser() { AxSHDocVw.AxWebBrowser _axWebBrowser = new AxSHDocVw.AxWebBrowser(); _axWebBrowser.Tag = new HE_WebBrowserTag(); TabPage _TabPage = new TabPage(); _TabPage.Controls.Add(_axWebBrowser); _axWebBrowser.Dock = DockStyle.Fill; _axWebBrowser.BeforeNavigate2 += new AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(this.axWebBrowser1_BeforeNavigate2); _axWebBrowser.DocumentComplete += new AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(this.axWebBrowser1_DocumentComplete); _axWebBrowser.NavigateComplete2 += new AxSHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(this.axWebBrowser1_NavigateComplete2); _axWebBrowser.NavigateError += new AxSHDocVw.DWebBrowserEvents2_NavigateErrorEventHandler(this.axWebBrowser1_NavigateError); _axWebBrowser.NewWindow2 += new AxSHDocVw.DWebBrowserEvents2_NewWindow2EventHandler(this.axWebBrowser1_NewWindow2); _axWebBrowser.ProgressChange += new AxSHDocVw.DWebBrowserEvents2_ProgressChangeEventHandler(this.axWebBrowser1_ProgressChange); _axWebBrowser.StatusTextChange += new AxSHDocVw.DWebBrowserEvents2_StatusTextChangeEventHandler(this.axWebBrowser1_StatusTextChange); _axWebBrowser.TitleChange += new AxSHDocVw.DWebBrowserEvents2_TitleChangeEventHandler(this.axWebBrowser1_TitleChange); _axWebBrowser.CommandStateChange += new AxSHDocVw.DWebBrowserEvents2_CommandStateChangeEventHandler(this.axWebBrowser1_CommandStateChange); tabControl1.TabPages.Add(_TabPage); tabControl1.SelectedTab = _TabPage; return _axWebBrowser; }
注意,每一個WebBrowser控件都有一個tag,我定義成一個簡單的class,它用來包含一些該控件相關的獨有信息。請看:
public class HE_WebBrowserTag { public int _TabIndex = 0; public bool _CanBack = false; public bool _CanForward = false; }
三、實現“查找”、“查看頁面源文件”、“選項”對話框等功能
注意 本例程中使用了一個未公開的GUID,其在將來的系統中可以發生變更。
1、定義 IOleCommandTarget 接口
為定義一個.NET接口以獲得關於一個COM接口的參考,請遵從下列步驟:
1) 賦予.NET接口相應的COM接口的GUID值;
本文示例代碼或素材下載