一、簡介
大家都知道,目前比較流行的網路瀏覽器如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值;
2) 包含對介面中所有方法的型別宣告;
3) 包含對Mshtml.dll和Shdocvw.dll檔案的參考,在Visual C# .NET工程中操作,請遵從:
A. 在項目菜單下單擊“添加引用”;
B. 單擊“COM” 選項卡;
C. 雙擊“Microsoft HTML Object Library” 和“Microsoft Internet Controls”。