引言
很早就有搞一個浏覽器的想法了,在vs2003上就試圖做過,苦於經常會有這種情況出現:當自治的浏覽器遇到彈出窗口時無法捕獲新的彈出窗口,於是乎新的彈出窗口仍舊用ie(或其他系統默認浏覽器)打開,在研究vs2005的WebBrowser控件時發現有NewWindow事件,於是乎興奮不已,決定用這個分頁浏覽器體驗一下vs2005。
實現功能
預覽圖如下:
當前浏覽器的"另存為","打印","打印御覽","頁面設置",刷新,前進,後退等等。幾乎都是控件封裝好了的,沒有幾句代碼。
浏覽器的分頁功能。當浏覽器有NewWindow激發時產生新的一頁。主要依靠NewWindow事件。
當前頁面的狀態。例如標題,狀態欄等。
實現過程以及關鍵點
新建一個vs2005的windows applaction項目
界面
一個MenuStrip實現最上面的菜單。
兩個ToolStrip分別是工具欄和地址欄。
一個TabControl也就是浏覽器的主體了,它的每個TabPage就是每一個分頁了。
一個StatusStrip也就是狀態欄了。
另外為了使窗體大小變化時控件也隨著變化注意使用控件的dock屬性。
搭成如下界面:
順便說一句和vs2003不同的是vs2005把例如
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.saveasToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.printPreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
這些通過我們拖拽控件,系統生成的界面代碼分離出來統一放在叫*.Designer.cs文件裡了,詳見事例代碼中的Form1.Designer.cs文件。
輔助方法
#region //輔助方法 /// <summary> /// 當在浏覽器地址欄敲"回車"時當前浏覽器重定向到指定url(tscbUrl.Tex) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tscbUrl_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { newCurrentPageUrl(tscbUrl.Text); } } /// <summary> /// 新建空白頁 /// </summary> private void newPage() { tscbUrl.Text = "about:blank"; TabPage mypage = new TabPage(); WebBrowser tempBrowser = new WebBrowser(); tempBrowser.Navigated += new WebBrowserNavigatedEventHandler(tempBrowser_Navigated); tempBrowser.NewWindow += new CancelEventHandler(tempBrowser_NewWindow); tempBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(tempBrowser_ProgressChanged); tempBrowser.StatusTextChanged += new EventHandler(tempBrowser_StatusTextChanged); tempBrowser.Dock = DockStyle.Fill; mypage.Controls.Add(tempBrowser); tabControl1.TabPages.Add(mypage); tabControl1.SelectedTab = mypage; } /// <summary> /// 臨時浏覽器進度變化事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void tempBrowser_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e) { toolStripProgressBar1.Maximum = (int)e.MaximumProgress; toolStripProgressBar1.Value = (int)e.CurrentProgress; } /// <summary> /// 新建一頁並定向到指定url /// </summary> /// <param name="address">新一頁的浏覽器重新定向到的url</param> private void newPage(string address) { TabPage mypage = new TabPage(); WebBrowser tempBrowser = new WebBrowser(); tempBrowser.Navigated += new WebBrowserNavigatedEventHandler(tempBrowser_Navigated); tempBrowser.NewWindow += new CancelEventHandler(tempBrowser_NewWindow); tempBrowser.StatusTextChanged += new EventHandler(tempBrowser_StatusTextChanged); tempBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(tempBrowser_ProgressChanged); tempBrowser.Url = getUrl(address); tempBrowser.Dock = DockStyle.Fill; mypage.Controls.Add(tempBrowser); tabControl1.TabPages.Add(mypage); } /// <summary> /// 獲取當前浏覽器 /// </summary> /// <returns>當前浏覽器</returns> private WebBrowser getCurrentBrowser() { WebBrowser currentBrowser = (WebBrowser)tabControl1.SelectedTab.Controls[0]; return currentBrowser; } /// <summary> /// 處理字符串為合法url /// </summary> /// <param name="address"></param> /// <returns></returns> private Uri getUrl(string address) { string tempaddress = address; if ((!address.StartsWith("http://")) && (!address.StartsWith("https://")) && (!address.StartsWith("ftp://"))) { tempaddress = "http://" + address; } Uri myurl; try { myurl = new Uri(tempaddress); } catch { myurl = new Uri("about:blank"); } return myurl; } /// <summary> /// 截取字符串為指定長度 /// </summary> /// <param name="oldstring"></param> /// <returns></returns> private string newstring(string oldstring) { string temp; if (oldstring.Length < TITLE_COUNT) { temp = oldstring; } else { temp = oldstring.Substring(0, TITLE_COUNT); } return temp; } /// <summary> /// 設置"前進","後退"button的可用狀態 /// </summary> private void setStatusButton() { backButton.Enabled = getCurrentBrowser().CanGoBack; forwordButton.Enabled = getCurrentBrowser().CanGoForward; } #endregion