C#实现多选项卡的浏览器控件
本文详细为大家分享了C#多选项卡的浏览器控件的设计与实现,供大家参考,具体内容如下
1. 为什么我们需要多选项卡的浏览器控件
项目中需要使用WinForm应用程序来包装BS应用程序的浏览器外壳,在.NET的WebBrowser中没有多选项卡浏览的自带配置属性,我们需要实现多选项卡的浏览器控件来实现包装BS应用程序的目的,而不会弹出IE浏览器窗口。
2. 我们需要了解哪些知识点
2.1. WebBrowser控件
WebBrowser控件为WebBrowserActiveX控件提供了托管包装。托管包装使您可以在Windows窗体客户端应用程序中显示网页。使用WebBrowser控件,可以复制应用程序中的InternetExplorerWeb浏览功能,还可以禁用默认的InternetExplorer功能,并将该控件用作简单的HTML文档查看器。
l 如何:使用WebBrowser控件定位到URL
this.webBrowser1.Navigate("http://www.microsoft.com");
l WebBrowser的CreateSink方法和DetachSink方法
CreateSink方法使基础ActiveX控件与可以处理控件事件的客户端相关联。
DetachSink方法使从基础ActiveX控件中释放附加在CreateSink方法中的事件处理客户端。
下面的代码示例演示如何在派生自WebBrowser的类中使用此方法,该方法使用OLEDWebBrowserEvents2接口中的NavigateError事件对常规WebBrowser事件进行补充。
usingSystem;
usingSystem.Windows.Forms;
usingSystem.Runtime.InteropServices;
usingSystem.Security.Permissions;
namespaceWebBrowserExtensibility
{
[PermissionSetAttribute(SecurityAction.Demand,Name="FullTrust")]
publicclassForm1:Form
{
[STAThread]
publicstaticvoidMain()
{
Application.Run(newForm1());
}
privateWebBrowser2wb=newWebBrowser2();
publicForm1()
{
wb.Dock=DockStyle.Fill;
wb.NavigateError+=new
WebBrowserNavigateErrorEventHandler(wb_NavigateError);
Controls.Add(wb);
wb.Navigate("www.widgets.microsoft.com");
}
privatevoidwb_NavigateError(
objectsender,WebBrowserNavigateErrorEventArgse)
{
//Displayanerrormessagetotheuser.
MessageBox.Show("Cannotnavigateto"+e.Url);
}
}
publicclassWebBrowser2:WebBrowser
{
AxHost.ConnectionPointCookiecookie;
WebBrowser2EventHelperhelper;
[PermissionSetAttribute(SecurityAction.LinkDemand,Name="FullTrust")]
protectedoverridevoidCreateSink()
{
base.CreateSink();
helper=newWebBrowser2EventHelper(this);
cookie=newAxHost.ConnectionPointCookie(
this.ActiveXInstance,helper,typeof(DWebBrowserEvents2));
}
[PermissionSetAttribute(SecurityAction.LinkDemand,Name="FullTrust")]
protectedoverridevoidDetachSink()
{
if(cookie!=null)
{
cookie.Disconnect();
cookie=null;
}
base.DetachSink();
}
publiceventWebBrowserNavigateErrorEventHandlerNavigateError;
protectedvirtualvoidOnNavigateError(
WebBrowserNavigateErrorEventArgse)
{
if(this.NavigateError!=null)
{
this.NavigateError(this,e);
}
}
privateclassWebBrowser2EventHelper:
StandardOleMarshalObject,DWebBrowserEvents2
{
privateWebBrowser2parent;
publicWebBrowser2EventHelper(WebBrowser2parent)
{
this.parent=parent;
}
publicvoidNavigateError(objectpDisp,refobjecturl,
refobjectframe,refobjectstatusCode,refboolcancel)
{
//RaisetheNavigateErrorevent.
this.parent.OnNavigateError(
newWebBrowserNavigateErrorEventArgs(
(String)url,(String)frame,(Int32)statusCode,cancel));
}
}
}
publicdelegatevoidWebBrowserNavigateErrorEventHandler(objectsender,
WebBrowserNavigateErrorEventArgse);
publicclassWebBrowserNavigateErrorEventArgs:EventArgs
{
privateStringurlValue;
privateStringframeValue;
privateInt32statusCodeValue;
privateBooleancancelValue;
publicWebBrowserNavigateErrorEventArgs(
Stringurl,Stringframe,Int32statusCode,Booleancancel)
{
urlValue=url;
frameValue=frame;
statusCodeValue=statusCode;
cancelValue=cancel;
}
publicStringUrl
{
get{returnurlValue;}
set{urlValue=value;}
}
publicStringFrame
{
get{returnframeValue;}
set{frameValue=value;}
}
publicInt32StatusCode
{
get{returnstatusCodeValue;}
set{statusCodeValue=value;}
}
publicBooleanCancel
{
get{returncancelValue;}
set{cancelValue=value;}
}
}
[ComImport,Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
TypeLibType(TypeLibTypeFlags.FHidden)]
publicinterfaceDWebBrowserEvents2
{
[DispId(271)]
voidNavigateError(
[In,MarshalAs(UnmanagedType.IDispatch)]objectpDisp,
[In]refobjectURL,[In]refobjectframe,
[In]refobjectstatusCode,[In,Out]refboolcancel);
}
}
l WebBrowser.DocumentCompleted事件
在WebBrowser控件完成加载文档时发生。
处理DocumentCompleted事件,在新文档完成加载时接收通知。如果DocumentCompleted事件发生,则新文档已完全加载,这意味着可以通过Document、DocumentText或DocumentStream属性访问该文档的内容。
2.2. TabControl控件
TabControl控件是Windows窗体多个选项卡控件,这些选项卡类似于笔记本中的分隔卡和档案柜文件夹中的标签。选项卡中可包含图片和其他控件。您可以使用该选项卡控件来生成多页对话框,这种对话框在Windows操作系统中的许多地方(例如控制面板的“显示”属性中)都可以找到。
l 如何:将控件添加到选项卡页
tabPage1.Controls.Add(newButton());
l 如何:使用Windows窗体TabControl添加和移除选项卡
添加选项卡
stringtitle="TabPage"+(tabControl1.TabCount+1).ToString(); TabPagemyTabPage=newTabPage(title); tabControl1.TabPages.Add(myTabPage);
移除选项卡
tabControl1.TabPages.Remove(tabControl1.SelectedTab);
l TabControl.DrawItem事件
如果将DrawMode属性设置为OwnerDrawFixed,则每当TabControl需要绘制它的一个选项卡时,它就会引发DrawItem事件。若要自定义选项卡的外观,请在用于DrawItem事件的处理程序中提供自己的绘制代码。
下面的代码示例创建一个包含一个TabPage的TabControl。本示例声明一个事件处理程序,并用来在tabPage1的选项卡上绘制字符串和Rectangle。该事件处理程序绑定到DrawItem事件。
usingSystem.Drawing;
usingSystem.Windows.Forms;
publicclassForm1:Form
{
privateRectangletabArea;
privateRectangleFtabTextArea;
publicForm1()
{
TabControltabControl1=newTabControl();
TabPagetabPage1=newTabPage();
tabControl1.DrawMode=TabDrawMode.OwnerDrawFixed;
tabControl1.SizeMode=TabSizeMode.Fixed;
tabControl1.Controls.Add(tabPage1);
tabControl1.ItemSize=newSize(80,30);
tabControl1.Location=newPoint(25,25);
tabControl1.Size=newSize(250,250);
tabPage1.TabIndex=0;
ClientSize=newSize(300,300);
Controls.Add(tabControl1);
tabArea=tabControl1.GetTabRect(0);
tabTextArea=(RectangleF)tabControl1.GetTabRect(0);
tabControl1.DrawItem+=newDrawItemEventHandler(DrawOnTab);
}
privatevoidDrawOnTab(objectsender,DrawItemEventArgse)
{
Graphicsg=e.Graphics;
Penp=newPen(Color.Blue);
Fontfont=newFont("Arial",10.0f);
SolidBrushbrush=newSolidBrush(Color.Red);
g.DrawRectangle(p,tabArea);
g.DrawString("tabPage1",font,brush,tabTextArea);
}
staticvoidMain()
{
Application.Run(newForm1());
}
}
3. 我们怎么设计多选项卡的浏览器控件
需要实现的功能特性:
l 实现打开BS应用程序的链接或窗口跳转到选项卡中而不是新窗口。
l 实现选项卡的关闭和新建,注意只有一个选项卡得时候不可以选项卡不可以出现关闭图片按钮。
我们主要采用TabControl和WebBrowser来实现多选项卡浏览器控件开发。
现介绍主要控件实现代码。
u 新建选项卡页面代码实现如下:
publicvoidCreateNewTabPage(stringurl)
{
ExtendedWebBrowserweb=newExtendedWebBrowser();
web.Name="WebBroswer"+_webBrowserLists.Count.ToString();
web.Dock=DockStyle.Fill;
web.Margin=newPadding(0,0,0,0);
web.DocumentCompleted+=newWebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
web.BeforeNewWindow+=newEventHandler(webBrowser1_BeforeNewWindow);
web.Navigate(url);
_webBrowserLists.Add(web);
TabPagetbp=newTabPage();
tbp.Name="TabPage"+tabControl1.TabCount.ToString();
tbp.Text="空白页";
tbp.Padding=newPadding(0,3,0,0);
tbp.Margin=newPadding(0,3,0,0);
tbp.ImageIndex=0;
tbp.Controls.Add(web);
this.tabControl1.Controls.Add(tbp);
this.tabControl1.SelectedTab=tbp;
}
u把网页标题及图片关闭按钮的绘制选项卡中代码实现如下:
privatevoidtabControl1_DrawItem(objectsender,DrawItemEventArgse)
{
try
{
Graphicsg=e.Graphics;
RectangletabRectangle=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(Penp=newPen(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"],newPoint(tabRectangle.X,tabRectangle.Y));
}
g.Dispose();
}
catch(Exceptionex)
{
throw(ex);
}
}
u Webbrowser控件完成时及Webbrowser控件新建窗口时代码实现如下:
privatevoidwebBrowser1_DocumentCompleted(objectsender,WebBrowserDocumentCompletedEventArgse)
{
ExtendedWebBrowserweb=(ExtendedWebBrowser)(sender);
stringtitle=web.Document.Title.Trim();
TabPagetb=(TabPage)web.Parent;
tb.Text=title.Length>6?title.Substring(0,6)+"...":title;
if(tabControl1.SelectedTab==tb)
{
this.Text=title;
}
}
privatevoidwebBrowser1_BeforeNewWindow(objectsender,System.EventArgse)
{
WebBrowserExtendedNavigatingEventArgseventArgs=easWebBrowserExtendedNavigatingEventArgs;
CreateNewTabPage(eventArgs.Url);
eventArgs.Cancel=true;
}
以上就是本文的全部内容,希望对大家的学习有所帮助。