Click here to Skip to main content
15,891,529 members
Articles / Multimedia / GDI+

FireFox-like Tab Control

Rate me:
Please Sign up or sign in to vote.
4.61/5 (54 votes)
24 Jun 2008CPOL3 min read 351.9K   14K   182  
An article on Tab Control
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Data;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
namespace MyControlLibrary
{
   /// <summary>
   /// Summary description for UserControl1.
   /// </summary>
   public class TabCtlEx : System.Windows.Forms.TabControl
   {
      /// <summary>
      /// Required designer variable.
      /// </summary>
      private System.ComponentModel.Container components = null;
      public delegate void OnHeaderCloseDelegate(object sender,CloseEventArgs e);
      public event OnHeaderCloseDelegate OnClose;
      public TabCtlEx()
      {
         // This call is required by the Windows.Forms Form Designer.
         InitializeComponent();
         this.TabStop = false;
         
         
         // TODO: Add any initialization after the InitComponent call

      }
      private bool confirmOnClose = true;
      public bool ConfirmOnClose
      {
         get
         {
            return this.confirmOnClose;
         }
         set
         {
            this.confirmOnClose = value;
         }
      }

      /// <summary>
      /// Clean up any resources being used.
      /// </summary>
      protected override void Dispose( bool disposing )
      {
         if( disposing )
         {
            if( components != null )
               components.Dispose();
         }
         base.Dispose( disposing );
      }
       

      #region Component Designer generated code
      /// <summary>
      /// Required method for Designer support - do not modify 
      /// the contents of this method with the code editor.
      /// </summary>
      private void InitializeComponent()
      {
         components = new System.ComponentModel.Container();
         SetStyle(System.Windows.Forms.ControlStyles.DoubleBuffer,true  );
         this.TabStop = false;
         //this.Controls.Add(this.btnClose); 
      }
      #endregion
      private Stream GetContentFromResource(string filename)
      {
         Assembly asm = Assembly.GetExecutingAssembly();
         Stream stream =  asm.GetManifestResourceStream("MyControlLibrary."+filename); 
         return stream;
          
      }
      protected override void OnDrawItem(DrawItemEventArgs e)
      {
          e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
         
         RectangleF tabTextArea = RectangleF.Empty;

         for (int nIndex = 0; nIndex < this.TabCount; nIndex++)
         {
             if (nIndex != this.SelectedIndex)
             {
                 tabTextArea = (RectangleF)this.GetTabRect(nIndex);
                 GraphicsPath _Path = new GraphicsPath();
                 _Path.AddRectangle(tabTextArea);
                 using (LinearGradientBrush _Brush = new LinearGradientBrush(tabTextArea, SystemColors.Control, SystemColors.ControlLight, LinearGradientMode.Vertical))
                 {
                     ColorBlend _ColorBlend = new ColorBlend(3);
                    _ColorBlend.Colors = new Color[]{SystemColors.ControlLightLight, 
                                                      Color.FromArgb(255,SystemColors.ControlLight),SystemColors.ControlDark,
                                                      SystemColors.ControlLightLight};

                     _ColorBlend.Positions = new float[] { 0f, .4f, 0.5f, 1f };
                     _Brush.InterpolationColors = _ColorBlend;
                    
                     e.Graphics.FillPath(_Brush, _Path);
					 using (Pen pen = new Pen(SystemColors.ActiveBorder))
					 {
						 e.Graphics.DrawPath(pen, _Path);
					 }


                     _ColorBlend.Colors = new Color[]{  SystemColors.ActiveBorder, 
                                                        SystemColors.ActiveBorder,SystemColors.ActiveBorder,
                                                        SystemColors.ActiveBorder};

                    _ColorBlend.Positions = new float[] { 0f, .4f, 0.5f, 1f };
                     _Brush.InterpolationColors = _ColorBlend;
                     e.Graphics.FillRectangle(_Brush, tabTextArea.X + tabTextArea.Width - 22, 4, tabTextArea.Height - 3, tabTextArea.Height - 5);
                     e.Graphics.DrawRectangle(Pens.White, tabTextArea.X + tabTextArea.Width - 20, 6, tabTextArea.Height - 8, tabTextArea.Height - 9);
                     using (Pen pen = new Pen(Color.White, 2))
                     {
                         e.Graphics.DrawLine(pen, tabTextArea.X + tabTextArea.Width - 16, 9, tabTextArea.X + tabTextArea.Width - 7, 17);
                         e.Graphics.DrawLine(pen, tabTextArea.X + tabTextArea.Width - 16, 17, tabTextArea.X + tabTextArea.Width - 7, 9);
                     }
                     if (CanDrawMenuButton(nIndex))
                     {
                         _ColorBlend.Positions = new float[] { 0f, .4f, 0.5f, 1f };
                         _Brush.InterpolationColors = _ColorBlend;
                         _ColorBlend.Positions = new float[] { 0f, .4f, 0.5f, 1f };
                         // assign the color blend to the pathgradientbrush
                         _Brush.InterpolationColors = _ColorBlend;

                         e.Graphics.FillRectangle(_Brush, tabTextArea.X + tabTextArea.Width - 43, 4, tabTextArea.Height - 3, tabTextArea.Height - 5);
                         //e.Graphics.DrawRectangle(SystemPens.GradientInactiveCaption, tabTextArea.X + tabTextArea.Width - 37, 7, 13, 13);
                         e.Graphics.DrawRectangle(new Pen(Color.White), tabTextArea.X + tabTextArea.Width - 41, 6, tabTextArea.Height - 7, tabTextArea.Height - 9);
                         using (Pen pen = new Pen(Color.White, 2))
                         {
                             e.Graphics.DrawLine(pen, tabTextArea.X + tabTextArea.Width - 36, 11, tabTextArea.X + tabTextArea.Width - 33, 16);
                             e.Graphics.DrawLine(pen, tabTextArea.X + tabTextArea.Width - 33, 16, tabTextArea.X + tabTextArea.Width - 30, 11);
                         }
                     }
                 }
                 _Path.Dispose();

             }
             else
             {

                 tabTextArea = (RectangleF)this.GetTabRect(nIndex);
                 GraphicsPath _Path = new GraphicsPath();
                 _Path.AddRectangle(tabTextArea);
                 using (LinearGradientBrush _Brush = new LinearGradientBrush(tabTextArea, SystemColors.Control, SystemColors.ControlLight, LinearGradientMode.Vertical))
                 {
                     ColorBlend _ColorBlend = new ColorBlend(3);
                     _ColorBlend.Colors = new Color[]{SystemColors.ControlLightLight, 
                                                      Color.FromArgb(255,SystemColors.Control),SystemColors.ControlLight,
                                                      SystemColors.Control};
                     _ColorBlend.Positions = new float[] { 0f, .4f, 0.5f, 1f };
                     _Brush.InterpolationColors = _ColorBlend;
                     e.Graphics.FillPath(_Brush, _Path);
					 using (Pen pen = new Pen(SystemColors.ActiveBorder))
					 {
					 	 e.Graphics.DrawPath(pen, _Path);
					 }
                     //Drawing Close Button
                     _ColorBlend.Colors = new Color[]{Color.FromArgb(255,231,164,152), 
                                                      Color.FromArgb(255,231,164,152),Color.FromArgb(255,197,98,79),
                                                      Color.FromArgb(255,197,98,79)};
                     _Brush.InterpolationColors = _ColorBlend;
                     e.Graphics.FillRectangle(_Brush, tabTextArea.X + tabTextArea.Width - 22, 4, tabTextArea.Height - 3, tabTextArea.Height - 5);
                     e.Graphics.DrawRectangle(Pens.White, tabTextArea.X + tabTextArea.Width - 20, 6, tabTextArea.Height - 8, tabTextArea.Height - 9);
                     using (Pen pen = new Pen(Color.White, 2))
                     {
                         e.Graphics.DrawLine(pen, tabTextArea.X + tabTextArea.Width - 16, 9, tabTextArea.X + tabTextArea.Width - 7, 17);
                         e.Graphics.DrawLine(pen, tabTextArea.X + tabTextArea.Width - 16, 17, tabTextArea.X + tabTextArea.Width - 7, 9);
                     }
                     if (CanDrawMenuButton(nIndex))
                     {
                         //Drawing menu button
                         _ColorBlend.Colors = new Color[]{SystemColors.ControlLightLight, 
                                                     Color.FromArgb(255,SystemColors.ControlLight),SystemColors.ControlDark,
                                                     SystemColors.ControlLightLight};
                         _ColorBlend.Positions = new float[] { 0f, .4f, 0.5f, 1f };
                         _Brush.InterpolationColors = _ColorBlend;
                         _ColorBlend.Colors = new Color[]{Color.FromArgb(255,170,213,243), 
                                                      Color.FromArgb(255,170,213,243),Color.FromArgb(255,44,137,191),
                                                      Color.FromArgb(255,44,137,191)};
                         _Brush.InterpolationColors = _ColorBlend;
                         e.Graphics.FillRectangle(_Brush, tabTextArea.X + tabTextArea.Width - 43, 4, tabTextArea.Height - 3, tabTextArea.Height - 5);
                         e.Graphics.DrawRectangle(Pens.White, tabTextArea.X + tabTextArea.Width - 41, 6, tabTextArea.Height - 7, tabTextArea.Height - 9);
                         using (Pen pen = new Pen(Color.White, 2))
                         {
                             e.Graphics.DrawLine(pen, tabTextArea.X + tabTextArea.Width - 36, 11, tabTextArea.X + tabTextArea.Width - 33, 16);
                             e.Graphics.DrawLine(pen, tabTextArea.X + tabTextArea.Width - 33, 16, tabTextArea.X + tabTextArea.Width - 30, 11);
                         }
                     }
                 }
                 _Path.Dispose();
             }
             string str = this.TabPages[nIndex].Text;
             StringFormat stringFormat = new StringFormat();
             stringFormat.Alignment = StringAlignment.Center;
             e.Graphics.DrawString(str, this.Font, new SolidBrush(this.TabPages[nIndex].ForeColor), tabTextArea, stringFormat);


         }   
         
      }

      private bool CanDrawMenuButton(int nIndex)
      {
          if(((TabPageEx)this.TabPages[nIndex]).Menu != null)
            return true;
          return false;
      }
      protected override void OnMouseLeave(EventArgs e)
      {
         
         
         Invalidate();
        
      }
      protected override void OnMouseMove(MouseEventArgs e)
      {
         
         
         for(int nIndex = 0 ; nIndex < this.TabCount ; nIndex++)
         {
            RectangleF tabTextArea = (RectangleF)this.GetTabRect(nIndex);
            tabTextArea = new RectangleF(tabTextArea.X + tabTextArea.Width - 22, 4, tabTextArea.Height - 3, tabTextArea.Height - 5);
            Graphics g = CreateGraphics();
            g.SmoothingMode = SmoothingMode.AntiAlias;
            Point pt = new Point(e.X,e.Y)       ;
            if(tabTextArea.Contains(pt))
            {
                 using (LinearGradientBrush _Brush = new LinearGradientBrush(tabTextArea, SystemColors.Control, SystemColors.ControlLight, LinearGradientMode.Vertical))
                 {
                     ColorBlend _ColorBlend = new ColorBlend(3);
                     _ColorBlend.Colors = new Color[]{Color.FromArgb(255,252,193,183), 
                                                      Color.FromArgb(255,252,193,183),Color.FromArgb(255,210,35,2),
                                                      Color.FromArgb(255,210,35,2)};
                     _ColorBlend.Positions = new float[] { 0f, .4f, 0.5f, 1f };
                     _Brush.InterpolationColors = _ColorBlend;
                     
                     g.FillRectangle(_Brush, tabTextArea);
                     g.DrawRectangle(Pens.White, tabTextArea.X +2, 6, tabTextArea.Height - 3, tabTextArea.Height - 4);
                     using (Pen pen = new Pen(Color.White, 2))
                     {
                         g.DrawLine(pen, tabTextArea.X + 6, 9, tabTextArea.X + 15, 17);
                         g.DrawLine(pen, tabTextArea.X + 6, 17, tabTextArea.X + 15, 9);
                     }
                 }
               
            }
            else
            {
                if (nIndex != SelectedIndex)
                {
                    using (LinearGradientBrush _Brush = new LinearGradientBrush(tabTextArea, SystemColors.Control, SystemColors.ControlLight, LinearGradientMode.Vertical))
                    {
                        ColorBlend _ColorBlend = new ColorBlend(3);
                        _ColorBlend.Colors = new Color[]{SystemColors.ActiveBorder, 
                                                      SystemColors.ActiveBorder,SystemColors.ActiveBorder,
                                                      SystemColors.ActiveBorder};
                        _ColorBlend.Positions = new float[] { 0f, .4f, 0.5f, 1f };
                        _Brush.InterpolationColors = _ColorBlend;

                        g.FillRectangle(_Brush, tabTextArea);
                        g.DrawRectangle(Pens.White, tabTextArea.X + 2, 6, tabTextArea.Height - 3, tabTextArea.Height - 4);
                        using (Pen pen = new Pen(Color.White, 2))
                        {
                            g.DrawLine(pen, tabTextArea.X + 6, 9, tabTextArea.X + 15, 17);
                            g.DrawLine(pen, tabTextArea.X + 6, 17, tabTextArea.X + 15, 9);
                        }
                    }
                }
            }
            if (CanDrawMenuButton(nIndex))
            {
                RectangleF tabMenuArea = (RectangleF)this.GetTabRect(nIndex);
                tabMenuArea = new RectangleF(tabMenuArea.X + tabMenuArea.Width - 43, 4, tabMenuArea.Height - 3, tabMenuArea.Height - 5);
                pt = new Point(e.X, e.Y);
                if (tabMenuArea.Contains(pt))
                {
                    using (LinearGradientBrush _Brush = new LinearGradientBrush(tabMenuArea, SystemColors.Control, SystemColors.ControlLight, LinearGradientMode.Vertical))
                    {
                        ColorBlend _ColorBlend = new ColorBlend(3);
                        _ColorBlend.Colors = new Color[]{Color.FromArgb(255,170,213,255), 
                                                      Color.FromArgb(255,170,213,255),Color.FromArgb(255,44,157,250),
                                                      Color.FromArgb(255,44,157,250)};
                        _ColorBlend.Positions = new float[] { 0f, .4f, 0.5f, 1f };
                        _Brush.InterpolationColors = _ColorBlend;

                        g.FillRectangle(_Brush, tabMenuArea);
                        g.DrawRectangle(Pens.White, tabMenuArea.X + 2, 6, tabMenuArea.Height - 2, tabMenuArea.Height - 4);
                        using (Pen pen = new Pen(Color.White, 2))
                        {
                            g.DrawLine(pen, tabMenuArea.X + 7, 11, tabMenuArea.X + 10, 16);
                            g.DrawLine(pen, tabMenuArea.X + 10, 16, tabMenuArea.X + 13, 11);
                        }
                    }

                }
                else
                {
                    if (nIndex != SelectedIndex)
                    {
                        using (LinearGradientBrush _Brush = new LinearGradientBrush(tabMenuArea, SystemColors.Control, SystemColors.ControlLight, LinearGradientMode.Vertical))
                        {
                            ColorBlend _ColorBlend = new ColorBlend(3);
                            _ColorBlend.Colors = new Color[]{SystemColors.ActiveBorder, 
                                                      SystemColors.ActiveBorder,SystemColors.ActiveBorder,
                                                      SystemColors.ActiveBorder};
                            _ColorBlend.Positions = new float[] { 0f, .4f, 0.5f, 1f };
                            _Brush.InterpolationColors = _ColorBlend;

                            g.FillRectangle(_Brush, tabMenuArea);
                            g.DrawRectangle(Pens.White, tabMenuArea.X + 2, 6, tabMenuArea.Height - 2, tabMenuArea.Height - 4);
                            using (Pen pen = new Pen(Color.White, 2))
                            {
                                g.DrawLine(pen, tabMenuArea.X + 7, 11, tabMenuArea.X + 10, 16);
                                g.DrawLine(pen, tabMenuArea.X + 10, 16, tabMenuArea.X + 13, 11);
                            }
                        }
                    }
                }
            }
            g.Dispose();
                      
            
         }
              

      }
      
      protected override void OnMouseDown(MouseEventArgs e)
      {
       
         RectangleF tabTextArea = (RectangleF)this.GetTabRect(SelectedIndex);
         tabTextArea = tabTextArea = new RectangleF(tabTextArea.X + tabTextArea.Width - 22, 4, tabTextArea.Height - 3, tabTextArea.Height - 5); 
         Point pt = new Point(e.X,e.Y);
         if(tabTextArea.Contains(pt))
         {
            if(confirmOnClose)
            {
               if(MessageBox.Show("You are about to close "+this.TabPages[SelectedIndex].Text.TrimEnd()  + " tab. Are you sure you want to continue?","Confirm close",MessageBoxButtons.YesNo) == DialogResult.No)
                  return;
            }
            //Fire Event to Client
            if(OnClose != null)
            {
               OnClose(this,new CloseEventArgs(SelectedIndex));
              
            }
         }
         if (CanDrawMenuButton(SelectedIndex))
         {
             RectangleF tabMenuArea = (RectangleF)this.GetTabRect(SelectedIndex);
             tabMenuArea = new RectangleF(tabMenuArea.X + tabMenuArea.Width - 43, 4, tabMenuArea.Height - 3, tabMenuArea.Height - 5);
             pt = new Point(e.X, e.Y);
             if (tabMenuArea.Contains(pt))
             {
                 if (((TabPageEx)this.TabPages[SelectedIndex]).Menu != null)
                 {
                     ((TabPageEx)this.TabPages[SelectedIndex]).Menu.Show(this, new Point((int)tabMenuArea.X, (int)(tabMenuArea.Y + tabMenuArea.Height)));
                 }
             }
         }
      }

   }

   public class CloseEventArgs:EventArgs
   {
      private int nTabIndex = -1;
      public CloseEventArgs(int nTabIndex)
      {
         this.nTabIndex = nTabIndex;
      }
      /// <summary>
      /// Get/Set the tab index value where the close button is clicked
      /// </summary>
      public int TabIndex 
      {
         get
         {
            return this.nTabIndex;
         }
         set
         {
            this.nTabIndex = value;
         }
      }
   
   }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
worst fellow working as a consultant in a Telecom company (USA)
knows little bit on C,C++ and C# with 5+ years of experience.

Comments and Discussions