c#多選項卡的瀏覽器控制項的設計及實現

來源:互聯網
上載者:User
文章目錄
  • 2.1.     WebBrowser控制項
  • 2.2.     TabControl控制項
1.       為什麼我們需要多選項卡的瀏覽器控制項

項目中需要使用WinForm應用程式來封裝BS應用程式的瀏覽器外殼,在.NET的WebBrowser中沒有多索引標籤式瀏覽的內建配置屬性,我們需要實現多選項卡的瀏覽器控制項來實現封裝BS應用程式的目的,而不會彈出IE瀏覽器視窗。

2.       我們需要瞭解哪些知識點2.1.     WebBrowser控制項

WebBrowser 控制項為 WebBrowser ActiveX 控制項提供了託管封裝。託管封裝使您可以在 Windows 表單用戶端應用程式中顯示網頁。使用 WebBrowser 控制項,可以複製應用程式中的 Internet Explorer 網頁瀏覽功能,還可以禁用預設的 Internet Explorer 功能,並將該控制項用作簡單的 HTML 文檔查看器。

如何:使用 WebBrowser 控制項定位到 URL

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

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

    }

}

WebBrowser. DocumentCompleted 事件

在 WebBrowser 控制項完成載入文檔時發生。

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

2.2.     TabControl控制項

TabControl 控制項是Windows 表單多個索引標籤控制項,這些選項卡類似於筆記本中的分隔卡和檔案櫃檔案夾中的標籤。選項卡中可包含圖片和其他控制項。您可以使用該索引標籤控制項來產生多頁對話方塊,這種對話方塊在 Windows 作業系統中的許多地方(例如控制台的“顯示”屬性中)都可以找到。

如何:將控制項添加到索引標籤頁面

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

 

如何:使用 Windows 表單 TabControl 添加和移除選項卡

添加選項卡

string title = "TabPage " + (tabControl1.TabCount + 1).ToString();

TabPage myTabPage = new TabPage(title);

tabControl1.TabPages.Add(myTabPage);

移除選項卡

tabControl1.TabPages.Remove(tabControl1.SelectedTab);

 

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;

}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.