using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
public class TabControlExtender : TabControl
{
private int _HeaderWidth;
private int _HeaderHeight;
private System.Drawing.ContentAlignment _HeaderAlignment;
private System.Windows.Forms.Padding _HeaderPadding;
private Font _HeaderFont;
private Color _HeaderBackColor;
private SolidBrush _HeaderBackBrush;
private Color _HeaderBorderColor;
private Pen _HeaderBackPen;
private Color _HeaderForeColor;
private SolidBrush _HeaderForeBrush;
private Color _HeaderSelectedBackColor;
private SolidBrush _HeaderSelectedBackBrush;
private Color _HeaderSelectedForeColor;
private Brush _HeaderSelectedForeBrush;
private Color _BackColor;
private System.Drawing.SolidBrush _BackBrush;
#region " Header Properties "
[System.ComponentModel.DefaultValue(100)]
public int HeaderWidth
{
get { return this._HeaderWidth; }
set
{
this._HeaderWidth = value;
this.ItemSize = new Size(this.ItemSize.Width, value);
}
}
[System.ComponentModel.DefaultValue(32)]
public int HeaderHeight
{
get { return this._HeaderHeight; }
set
{
this._HeaderHeight = value;
this.ItemSize = new Size(value, this.ItemSize.Height);
}
}
[System.ComponentModel.DefaultValue(typeof(System.Drawing.ContentAlignment), "ContentAlignment.MiddleLeft")]
public System.Drawing.ContentAlignment HeaderAlignment
{
get { return this._HeaderAlignment; }
set
{
this._HeaderAlignment = value;
this.Invalidate();
}
}
[System.ComponentModel.DefaultValue(typeof(System.Windows.Forms.Padding), "3,3,3,3")]
public System.Windows.Forms.Padding HeaderPadding
{
get { return this._HeaderPadding; }
set
{
this._HeaderPadding = value;
this.Invalidate();
}
}
[System.ComponentModel.DefaultValue(typeof(Color), "White")]
public Color HeaderBorderColor
{
get { return this._HeaderBorderColor; }
set
{
if (!(value == this._HeaderBorderColor))
{
this._HeaderBorderColor = value;
if (this._HeaderBackPen != null)
{
this._HeaderBackPen.Dispose();
this._HeaderBackPen = null;
}
this.Invalidate();
}
}
}
[System.ComponentModel.DefaultValue(typeof(Color), "LightGray")]
public Color HeaderBackColor
{
get { return this._HeaderBackColor; }
set
{
if (!(value == this._HeaderBackColor))
{
this._HeaderBackColor = value;
if (this._HeaderBackBrush != null)
{
this._HeaderBackBrush.Dispose();
this._HeaderBackBrush = null;
}
this.Invalidate();
}
}
}
private SolidBrush HeaderBackBrush
{
get
{
if (this._HeaderBackBrush == null)
{
this._HeaderBackBrush = new SolidBrush(this.HeaderBackColor);
}
return this._HeaderBackBrush;
}
}
private Pen HeaderPen
{
get
{
if (this._HeaderBackPen == null)
{
this._HeaderBackPen = new Pen(this.HeaderBorderColor);
}
return this._HeaderBackPen;
}
}
[System.ComponentModel.DefaultValue(typeof(Color), "Black")]
public Color HeaderForeColor
{
get { return this._HeaderForeColor; }
set
{
if (!(value == this._HeaderForeColor))
{
this._HeaderForeColor = value;
if (this._HeaderForeBrush != null)
{
this._HeaderForeBrush.Dispose();
this._HeaderForeBrush = null;
}
this.Invalidate();
}
}
}
private SolidBrush HeaderForeBrush
{
get
{
if (this._HeaderForeBrush == null)
{
this._HeaderForeBrush = new SolidBrush(this.HeaderForeColor);
}
return this._HeaderForeBrush;
}
}
[System.ComponentModel.DefaultValue(typeof(Color), "DarkGray")]
public Color HeaderSelectedBackColor
{
get { return this._HeaderSelectedBackColor; }
set
{
if (!(value == this._HeaderSelectedBackColor))
{
this._HeaderSelectedBackColor = value;
if (this._HeaderSelectedBackBrush != null)
{
this._HeaderSelectedBackBrush.Dispose();
this._HeaderSelectedBackBrush = null;
}
this.Invalidate();
}
}
}
private SolidBrush HeaderSelectedBackBrush
{
get
{
if (this._HeaderSelectedBackBrush == null)
{
this._HeaderSelectedBackBrush = new SolidBrush(this.HeaderSelectedBackColor);
}
return this._HeaderSelectedBackBrush;
}
}
[System.ComponentModel.DefaultValue(typeof(Color), "Black")]
public Color HeaderSelectedForeColor
{
get { return this._HeaderSelectedForeColor; }
set
{
if (!(value == this._HeaderSelectedForeColor))
{
this._HeaderSelectedForeColor = value;
this._HeaderSelectedForeBrush.Dispose();
this._HeaderSelectedForeBrush = null;
this.Invalidate();
}
}
}
private SolidBrush HeaderSelectedForeBrush
{
get
{
if (this._HeaderSelectedForeBrush == null)
{
this._HeaderSelectedForeBrush = new SolidBrush(this.HeaderSelectedForeColor);
}
return (SolidBrush)this._HeaderSelectedForeBrush;
}
}
public Font HeaderFont
{
get { return this._HeaderFont; }
set
{
this._HeaderFont = value;
this.Invalidate();
}
}
#endregion
[System.ComponentModel.DefaultValue(typeof(Color), "White")]
[System.ComponentModel.Browsable(true)]
public override Color BackColor
{
get { return this._BackColor; }
set
{
if (!(this._BackColor == value))
{
this._BackColor = value;
if (this._BackBrush != null)
{
this._BackBrush.Dispose();
this._BackBrush = null;
}
this.Invalidate();
}
}
}
private SolidBrush BackBrush
{
get
{
if (this._BackBrush == null)
{
this._BackBrush = new SolidBrush(this.BackColor);
}
return this._BackBrush;
}
}
public TabControlExtender()
{
this._HeaderWidth = 100;
this._HeaderHeight = 32;
this._HeaderAlignment = ContentAlignment.MiddleLeft;
this._HeaderPadding = new Padding(3);
this._BackColor = Color.White;
this._HeaderBorderColor = Color.White;
this._HeaderFont = this.Font;
this._HeaderForeColor = Color.Black;
this._HeaderBackColor = Color.DarkGray;
this._HeaderSelectedBackColor = Color.LightGray;
this._HeaderSelectedForeColor = Color.Black;
this.DrawMode = TabDrawMode.OwnerDrawFixed;
this.SizeMode = TabSizeMode.Fixed;
this.Alignment = TabAlignment.Left;
this.ItemSize = new Size(this.HeaderHeight, this.HeaderWidth);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
Graphics g = default(Graphics);
g = e.Graphics;
g.FillRectangle(this.BackBrush, e.ClipRectangle);
// background
for (int i = 0; i <= this.TabPages.Count - 1; i++)
{
this.DrawTabButton(g, i);
this.DrawTabText(g, i);
}
}
private void DrawTabButton(Graphics g, int TabPageIndex)
{
Rectangle r = default(Rectangle);
// get the tab rectangle
r = this.GetTabRect(TabPageIndex);
// increase its width we dont want the background in between
r.Width = r.Width + 2;
// if first tab page
if (TabPageIndex == 0)
{
// reduce its height and move it a little bit lower
// since in tab control first tab button is displayed a little
// bit heigher
r.Height = r.Height - 2;
r.Y = r.Y + 2;
}
// if given tab button is selected
if (this.SelectedIndex == TabPageIndex)
{
// use selected properties
g.FillRectangle(this.HeaderSelectedBackBrush, r);
// if currently focused then draw focus rectangle
if (this.Focused)
{
System.Windows.Forms.ControlPaint.DrawFocusRectangle(g, new Rectangle(r.Left + 2, r.Top + 2, r.Width - 4, r.Height - 5));
}
// else (not the selected tab page)
}
else
{
g.FillRectangle(this.HeaderBackBrush, r);
}
// if first tab button
if (TabPageIndex == 0)
{
// draw a line on top
g.DrawLine(this.HeaderPen, r.Left, r.Top, r.Right, r.Top);
}
// line at left
g.DrawLine(this.HeaderPen, r.Left, r.Top, r.Left, r.Bottom - 1);
// line at bottom
g.DrawLine(this.HeaderPen, r.Left, r.Bottom - 1, r.Right, r.Bottom - 1);
// no line at right since we want to give an effect of
// pages
}
private void DrawTabText(Graphics g, int TabPageIndex)
{
int iX = 0;
int iY = 0;
string sText = null;
SizeF sizeText = default(SizeF);
Rectangle rectTab = default(Rectangle);
// get tab button rectangle
rectTab = this.GetTabRect(TabPageIndex);
// get text
sText = this.TabPages[TabPageIndex].Text ;
// measure the size of text
sizeText = g.MeasureString(sText, this.HeaderFont);
// check text alignment
switch (this.HeaderAlignment)
{
case ContentAlignment.MiddleLeft:
case ContentAlignment.BottomLeft:
case ContentAlignment.TopLeft:
iX = rectTab.Left + this.HeaderPadding.Left;
break;
case ContentAlignment.MiddleRight:
case ContentAlignment.BottomRight:
case ContentAlignment.TopRight:
iX = rectTab.Right - Convert.ToInt32(sizeText.Width) - this.HeaderPadding.Right;
break;
case ContentAlignment.MiddleCenter:
case ContentAlignment.BottomCenter:
case ContentAlignment.TopCenter:
iX = rectTab.Left + (rectTab.Width - this.HeaderPadding.Left - this.HeaderPadding.Right - Convert.ToInt32(sizeText.Width)) / 2;
break;
}
switch (this.HeaderAlignment)
{
case ContentAlignment.TopLeft:
case ContentAlignment.TopCenter:
case ContentAlignment.TopRight:
iY = rectTab.Top + this.HeaderPadding.Top;
break;
case ContentAlignment.BottomLeft:
case ContentAlignment.BottomCenter:
case ContentAlignment.BottomRight:
iY = rectTab.Bottom - Convert.ToInt32(sizeText.Height) - this.HeaderPadding.Bottom;
break;
case ContentAlignment.MiddleCenter:
case ContentAlignment.MiddleLeft:
case ContentAlignment.MiddleRight:
iY = rectTab.Top + (rectTab.Height - this.HeaderPadding.Top - Convert.ToInt32(sizeText.Height)) / 2;
break;
}
// if selected tab button
if (this.SelectedIndex == TabPageIndex)
{
g.DrawString(sText, this.HeaderFont, this.HeaderSelectedForeBrush, iX, iY);
}
else
{
g.DrawString(sText, this.HeaderFont, this.HeaderForeBrush, iX, iY);
}
}
}
You are welcome.
RépondreSupprimerHi Hicham LAKHDAR, Great Work. If the no. of tabs are more like 30 to 60 then the control got disturbed. Tabs would not flow from top to bottom rather than spreading tabs in multiple columns. So do you have any workaround for this. Thanks in advance.
RépondreSupprimer