亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

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

2020-01-24 01:14:56
字體:
來源:轉載
供稿:網友

本文詳細為大家分享了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 事件進行補充。

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 添加和移除選項卡

添加選項卡

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 事件。

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  新建選項卡頁面代碼實現如下:

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控件新建窗口時代碼實現如下:

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;}

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性色av一区二区三区免费| 色噜噜亚洲精品中文字幕| 久久久精品国产网站| 欧美亚洲国产视频| 亚洲精品国精品久久99热一| 国产成人啪精品视频免费网| 国产91在线播放精品91| 美日韩精品免费视频| 国产精自产拍久久久久久蜜| 中文字幕久久久av一区| 欧美性猛交xxxx免费看久久久| 欧美有码在线视频| 黑人欧美xxxx| 91产国在线观看动作片喷水| 亚洲精品国产精品乱码不99按摩| 九九热这里只有精品6| 欧美自拍视频在线| 国产一区私人高清影院| 777777777亚洲妇女| 亚洲欧美国产精品久久久久久久| 欧美野外猛男的大粗鳮| 久久99热精品这里久久精品| www.欧美精品一二三区| 国产97在线|日韩| 亚洲社区在线观看| 国产噜噜噜噜噜久久久久久久久| 亚洲男人天堂九九视频| 日韩中文字幕在线观看| 欧美日韩午夜剧场| 九九久久精品一区| 最近2019年好看中文字幕视频| 日韩中文字幕av| 欧洲永久精品大片ww免费漫画| 国产成人免费av| 狠狠爱在线视频一区| 国内精品久久久久| 亚洲国产精品字幕| 久久久久久久久久久91| 26uuu亚洲伊人春色| 欧美另类在线观看| 国产精品久久久久久av下载红粉| 久久综合久久八八| 日韩欧美有码在线| 久久免费视频在线观看| 97久久国产精品| 久久99国产综合精品女同| 亚洲另类激情图| 欧美成人午夜激情在线| 91精品在线播放| 国产精品福利小视频| 91精品国产91久久久| 中文国产成人精品久久一| 亚洲自拍偷拍色片视频| 91精品国产高清自在线看超| 日韩精品视频在线免费观看| 欧美一区三区三区高中清蜜桃| 日韩欧美中文字幕在线播放| 国产又爽又黄的激情精品视频| 欧美性猛交xxxx富婆| 精品无人国产偷自产在线| 97精品一区二区三区| 久久av在线看| 欧美激情精品久久久| 亚洲最大福利视频网站| 国产精品丝袜白浆摸在线| 亚洲男人av电影| 国产成人免费91av在线| 久久精品久久精品亚洲人| 九九热精品视频| 久久亚洲综合国产精品99麻豆精品福利| 高清欧美电影在线| 亚洲精品第一国产综合精品| 亚洲国产精品一区二区久| 欧美成在线视频| 亚洲欧美国产另类| 亚洲人成77777在线观看网| 欧美精品亚州精品| 欧美中文字幕视频在线观看| 亚洲精品99久久久久中文字幕| 日韩精品福利网站| 久久av红桃一区二区小说| 深夜福利91大全| 91亚洲精品久久久久久久久久久久| 成人高清视频观看www| 精品二区三区线观看| 欧美性猛交xxxx乱大交| 亚洲欧美在线一区| 久久亚洲综合国产精品99麻豆精品福利| 国产精品日韩专区| 国产精品r级在线| 欧美精品少妇videofree| 中文字幕欧美国内| 久久精品国产99国产精品澳门| 久久免费精品视频| 亚洲美女视频网| 亚洲欧美制服中文字幕| 九九久久久久99精品| 欧美中文字幕在线视频| 欧美日韩另类字幕中文| 日本高清视频精品| 动漫精品一区二区| 欧美日韩一区二区免费视频| 日本久久久a级免费| 91久久夜色精品国产网站| 2019中文字幕在线| 国外成人在线播放| 国产成人免费av| 九九九热精品免费视频观看网站| 91久久精品国产91久久| 欧美性猛交xxxx富婆弯腰| 成人国产亚洲精品a区天堂华泰| 国产激情久久久| 日韩av大片在线| 亚洲第一页在线| 久久久久久久久久久91| 国产极品jizzhd欧美| 亚洲一区二区少妇| 亚洲无亚洲人成网站77777| 91精品国产成人www| 亚洲激情国产精品| 超在线视频97| 亚洲福利视频在线| 国产在线视频2019最新视频| 2019中文字幕在线观看| 国产精品免费小视频| 国产在线观看精品| 欧美天堂在线观看| 国产97色在线|日韩| 亚洲天堂精品在线| 久热精品视频在线| 国产性猛交xxxx免费看久久| 欧美壮男野外gaytube| 欧美夫妻性生活视频| 性日韩欧美在线视频| 亚洲裸体xxxx| 激情成人在线视频| 视频一区视频二区国产精品| 成人免费视频97| 午夜欧美大片免费观看| 国产精品高清网站| 中文字幕在线看视频国产欧美| 久久影视电视剧免费网站| 91免费看片在线| 久久久精品日本| 日韩精品在线看| 久久精彩免费视频| 7777kkkk成人观看| 亚洲免费福利视频| 在线观看日韩www视频免费| 久久久久久久久久久人体| 亚洲free嫩bbb| 国产精品吹潮在线观看| 日韩成人高清在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲美女av黄| 欧美国产日韩一区| 日韩中文字幕网| 精品自拍视频在线观看| 一本色道久久综合狠狠躁篇的优点| 在线日韩第一页| 亚洲一区二区三区777| 夜夜躁日日躁狠狠久久88av| 在线观看日韩www视频免费| 成人免费激情视频|