程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#實現多選項卡的浏覽器控件

C#實現多選項卡的浏覽器控件

編輯:關於C語言

本文詳細為大家分享了C#多選項卡的浏覽器控件的設計與實現,供大家參考,具體內容如下

1. 為什麼我們需要多選項卡的浏覽器控件
項目中需要使用WinForm應用程序來包裝BS應用程序的浏覽器外殼,在.Net的WebBrowser中沒有多選項卡浏覽的自帶配置屬性,我們需要實現多選項卡的浏覽器控件來實現包裝BS應用程序的目的,而不會彈出IE浏覽器窗口。

2. 我們需要了解哪些知識點
2.1. WebBrowser控件
WebBrowser 控件為 WebBrowser ActiveX 控件提供了托管包裝。托管包裝使您可以在 Windows 窗體客戶端應用程序中顯示網頁。使用 WebBrowser 控件,可以復制應用程序中的 Internet Explorer Web 浏覽功能,還可以禁用默認的 Internet Explorer 功能,並將該控件用作簡單的 Html 文檔查看器。

l 如何:使用 WebBrowser 控件定位到 URL

this.webBrowser1.Navigate("http://www.microsoft.com");

l WebBrowser的 CreateSink 方法和DetachSink 方法

CreateSink方法使基礎 ActiveX 控件與可以處理控件事件的客戶端相關聯。

DetachSink方法使從基礎 ActiveX 控件中釋放附加在 CreateSink 方法中的事件處理客戶端。

下面的代碼示例演示如何在派生自 WebBrowser 的類中使用此方法,該方法使用 OLE DWebBrowserEvents2 接口中的 NavigateError 事件對常規 WebBrowser 事件進行補充。

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 using System; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Security.Permissions; namespace WebBrowserExtensibility { [PermissionSetAttribute(SecurityAction.Demand, Name="FullTrust")] public class Form1 : Form { [STAThread] public static void Main() { Application.Run(new Form1()); } private WebBrowser2 wb = new WebBrowser2(); public Form1() { wb.Dock = DockStyle.Fill; wb.NavigateError += new WebBrowserNavigateErrorEventHandler(wb_NavigateError); Controls.Add(wb); wb.Navigate("www.widgets.microsoft.com"); } private void wb_NavigateError( object sender, WebBrowserNavigateErrorEventArgs e) { // Display an error message to the user. MessageBox.Show("Cannot navigate to " + e.Url); } } public class WebBrowser2 : WebBrowser { AxHost.ConnectionPointCookie cookIE; WebBrowser2EventHelper helper; [PermissionSetAttribute(SecurityAction.LinkDemand, Name="FullTrust")] protected override void CreateSink() { base.CreateSink(); helper = new WebBrowser2EventHelper(this); cookIE = new AxHost.ConnectionPointCookIE( this.ActiveXInstance, helper, typeof(DWebBrowserEvents2)); } [PermissionSetAttribute(SecurityAction.LinkDemand, Name="FullTrust")] protected override void DetachSink() { if (cookIE != null) { cookIE.Disconnect(); cookIE = null; } base.DetachSink(); } public event WebBrowserNavigateErrorEventHandler NavigateError; protected virtual void OnNavigateError( WebBrowserNavigateErrorEventArgs e) { if (this.NavigateError != null) { this.NavigateError(this, e); } } private class WebBrowser2EventHelper : StandardOleMarshalObject, DWebBrowserEvents2 { private WebBrowser2 parent; public WebBrowser2EventHelper(WebBrowser2 parent) { this.parent = parent; } public void NavigateError(object pDisp, ref object url, ref object frame, ref object statusCode, ref bool cancel) { // Raise the NavigateError event. this.parent.OnNavigateError( new WebBrowserNavigateErrorEventArgs( (String)url, (String)frame, (Int32)statusCode, cancel)); } } } public delegate void WebBrowserNavigateErrorEventHandler(object sender, WebBrowserNavigateErrorEventArgs e); public class WebBrowserNavigateErrorEventArgs : EventArgs { private String urlValue; private String frameValue; private Int32 statusCodeValue; private Boolean cancelValue; public WebBrowserNavigateErrorEventArgs( String url, String frame, Int32 statusCode, Boolean cancel) { urlValue = url; frameValue = frame; statusCodeValue = statusCode; cancelValue = cancel; } public String Url { get { return urlValue; } set { urlValue = value; } } public String Frame { get { return frameValue; } set { frameValue = value; } } public Int32 StatusCode { get { return statusCodeValue; } set { statusCodeValue = value; } } public Boolean Cancel { get { return cancelValue; } set { cancelValue = value; } } } [ComImport, Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch), TypeLibType(TypeLibTypeFlags.FHidden)] public interface DWebBrowserEvents2 { [DispId(271)] void NavigateError( [In, MarshalAs(UnmanagedType.IDispatch)] object pDisp, [In] ref object URL, [In] ref object frame, [In] ref object statusCode, [In, Out] ref bool cancel); } }

l WebBrowser. DocumentCompleted 事件

在 WebBrowser 控件完成加載文檔時發生。

處理 DocumentCompleted 事件,在新文檔完成加載時接收通知。如果 DocumentCompleted 事件發生,則新文檔已完全加載,這意味著可以通過 Document、DocumentText 或 DocumentStream 屬性訪問該文檔的內容。

2.2. TabControl控件
TabControl 控件是Windows 窗體多個選項卡控件,這些選項卡類似於筆記本中的分隔卡和檔案櫃文件夾中的標簽。選項卡中可包含圖片和其他控件。您可以使用該選項卡控件來生成多頁對話框,這種對話框在 Windows 操作系統中的許多地方(例如控制面板的“顯示”屬性中)都可以找到。

l 如何:將控件添加到選項卡頁

tabPage1.Controls.Add(new Button());

l 如何:使用 Windows 窗體 TabControl 添加和移除選項卡

添加選項卡

? 1 2 3 4 5 string title = "TabPage " + (tabControl1.TabCount + 1).ToString(); TabPage myTabPage = new TabPage(title); tabControl1.TabPages.Add(myTabPage);

移除選項卡

tabControl1.TabPages.Remove(tabControl1.SelectedTab);

l TabControl.DrawItem 事件

如果將 DrawMode 屬性設置為 OwnerDrawFixed,則每當 TabControl 需要繪制它的一個選項卡時,它就會引發 DrawItem 事件。若要自定義選項卡的外觀,請在用於 DrawItem 事件的處理程序中提供自己的繪制代碼。

下面的代碼示例創建一個包含一個 TabPage 的 TabControl。本示例聲明一個事件處理程序,並用來在 tabPage1 的選項卡上繪制字符串和 Rectangle。該事件處理程序綁定到 DrawItem 事件。

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 using System.Drawing; using System.Windows.Forms; public class Form1 : Form { private Rectangle tabArea; private RectangleF tabTextArea; public Form1() { TabControl tabControl1 = new TabControl(); TabPage tabPage1 = new TabPage(); tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; tabControl1.SizeMode = TabSizeMode.Fixed; tabControl1.Controls.Add(tabPage1); tabControl1.ItemSize = new Size(80, 30); tabControl1.Location = new Point(25, 25); tabControl1.Size = new Size(250, 250); tabPage1.TabIndex = 0; ClIEntSize = new Size(300, 300); Controls.Add(tabControl1); tabArea = tabControl1.GetTabRect(0); tabTextArea = (RectangleF)tabControl1.GetTabRect(0); tabControl1.DrawItem += new DrawItemEventHandler(DrawOnTab); } private void DrawOnTab(object sender, DrawItemEventArgs e) { Graphics g = e.Graphics; Pen p = new Pen(Color.Blue); Font font = new Font("Arial", 10.0f); SolidBrush brush = new SolidBrush(Color.Red); g.DrawRectangle(p, tabArea); g.DrawString("tabPage1", font, brush, tabTextArea); } static void Main() { Application.Run(new Form1()); } }

3. 我們怎麼設計多選項卡的浏覽器控件
需要實現的功能特性:

l 實現打開BS應用程序的鏈接或窗口跳轉到選項卡中而不是新窗口。

l 實現選項卡的關閉和新建,注意只有一個選項卡得時候不可以選項卡不可以出現關閉圖片按鈕。

我們主要采用TabControl和WebBrowser來實現多選項卡浏覽器控件開發。

現介紹主要控件實現代碼。

u 新建選項卡頁面代碼實現如下:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 public void CreateNewTabPage(string url) { ExtendedWebBrowser web = new ExtendedWebBrowser(); web.Name = "WebBroswer" + _webBrowserLists.Count.ToString(); web.Dock = DockStyle.Fill; web.Margin = new Padding(0, 0, 0, 0); web.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); web.BeforeNewWindow += new EventHandler(webBrowser1_BeforeNewWindow); web.Navigate(url); _webBrowserLists.Add(web); TabPage tbp = new TabPage(); tbp.Name = "TabPage" + tabControl1.TabCount.ToString(); tbp.Text = "空白頁"; tbp.Padding = new Padding(0, 3, 0, 0); tbp.Margin = new Padding(0, 3, 0, 0); tbp.ImageIndex = 0; tbp.Controls.Add(web); this.tabControl1.Controls.Add(tbp); this.tabControl1.SelectedTab = tbp; } u 把網頁標題及圖片關閉按鈕的繪制選項卡中代碼實現如下: private void tabControl1_DrawItem(object sender, DrawItemEventArgs e) { try { Graphics g = e.Graphics; Rectangle tabRectangle = this.tabControl1.GetTabRect(e.Index); //先添加TabPage屬性 g.DrawString(this.tabControl1.TabPages[e.Index].Text , this.Font, SystemBrushes.ControlText, tabRectangle.X + 3, tabRectangle.Y + 3); if (tabControl1.TabCount > 1) { //再畫一個矩形框 using (Pen p = new Pen(SystemColors.Control)) { tabRectangle.Offset(tabRectangle.Width - (CLOSE_SIZE + 3), 2); tabRectangle.Width = CLOSE_SIZE; tabRectangle.Height = CLOSE_SIZE; g.DrawRectangle(p, tabRectangle); } g.DrawImage(e.State == DrawItemState.Selected ? imageList1.Images["closeSelected"] : imageList1.Images["close"], new Point(tabRectangle.X, tabRectangle.Y)); } g.Dispose(); } catch (Exception ex) { throw (ex); } }

u Webbrowser控件完成時及Webbrowser控件新建窗口時代碼實現如下:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { ExtendedWebBrowser web = (ExtendedWebBrowser)(sender); string title = web.Document.Title.Trim(); TabPage tb = (TabPage)web.Parent; tb.Text = title.Length > 6 ? title.Substring(0, 6) + "..." : title; if (tabControl1.SelectedTab == tb) { this.Text = title; } } private void webBrowser1_BeforeNewWindow(object sender, System.EventArgs e) { WebBrowserExtendedNavigatingEventArgs eventArgs = e as WebBrowserExtendedNavigatingEventArgs; CreateNewTabPage(eventArgs.Url); eventArgs.Cancel = true; }

以上就是本文的全部內容,希望對大家的學習有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved