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; }
以上就是本文的全部内容,希望对大家的学习有所帮助。