Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version

FireFox-like Tab Control

, 24 Jun 2008 CPOL
An article on Tab Control
sourcecode_tabcontrol.zip
SourceCode_TabControl
SourceCode_TabControl
TabControl_Demo
TabCtrl
TabCtrl.csproj.user
Tab_Control_Demo
App.ico
Tab_Control_Demo.csproj.user
sourcecode_tabcontrol_2005.zip
SourceCode_TabControl_2005
SourceCode_TabControl
SourceCode_TabControl
TabControl_Demo
TabCtrl
TabCtrl.csproj.user
Tab_Control_Demo
App.ico
Tab_Control_Demo.csproj.user
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)

Share

About the Author

vijayaprasen
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.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.1411022.1 | Last Updated 24 Jun 2008
Article Copyright 2007 by vijayaprasen
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid