本文詳細為大家分享了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 276using
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 5string
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 73using
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 115public
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 33private
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
;
}
以上就是本文的全部內容,希望對大家的學習有所幫助。