161 lines
5.8 KiB
C#
161 lines
5.8 KiB
C#
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
|
|
namespace CoreUnit.Common
|
|
{
|
|
public class FlatTabControl : TabControl
|
|
{
|
|
#region Public Properties
|
|
|
|
[Description("Color for a decorative line"), Category("Appearance")]
|
|
public Color LineColor { get; set; } = SystemColors.Highlight;
|
|
|
|
[Description("Color for all Borders"), Category("Appearance")]
|
|
public Color BorderColor { get; set; } = SystemColors.ControlDark;
|
|
|
|
[Description("Back color for selected Tab"), Category("Appearance")]
|
|
public Color SelectTabColor { get; set; } = SystemColors.ControlLight;
|
|
|
|
[Description("Fore Color for Selected Tab"), Category("Appearance")]
|
|
public Color SelectedForeColor { get; set; } = SystemColors.HighlightText;
|
|
|
|
[Description("Back Color for un-selected tabs"), Category("Appearance")]
|
|
public Color TabColor { get; set; } = SystemColors.ControlLight;
|
|
|
|
[Description("Background color for the whole control"), Category("Appearance"), Browsable(true)]
|
|
public override Color BackColor { get; set; } = SystemColors.Control;
|
|
|
|
[Description("Fore Color for all Texts"), Category("Appearance")]
|
|
public override Color ForeColor { get; set; } = SystemColors.ControlText;
|
|
|
|
#endregion
|
|
|
|
public FlatTabControl()
|
|
{
|
|
try {
|
|
Appearance = TabAppearance.Buttons;
|
|
DrawMode = TabDrawMode.Normal;
|
|
ItemSize = new Size(0, 0);
|
|
SizeMode = TabSizeMode.Fixed;
|
|
} catch { }
|
|
}
|
|
|
|
protected override void InitLayout()
|
|
{
|
|
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
|
SetStyle(ControlStyles.DoubleBuffer, true);
|
|
SetStyle(ControlStyles.ResizeRedraw, true);
|
|
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
|
|
SetStyle(ControlStyles.UserPaint, true);
|
|
base.InitLayout();
|
|
}
|
|
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
base.OnPaint(e);
|
|
DrawControl(e.Graphics);
|
|
}
|
|
|
|
internal void DrawControl(Graphics g)
|
|
{
|
|
try {
|
|
if (!Visible) {
|
|
return;
|
|
}
|
|
|
|
Rectangle clientRectangle = ClientRectangle;
|
|
clientRectangle.Inflate(2, 2);
|
|
|
|
// Whole Control Background:
|
|
using (Brush bBackColor = new SolidBrush(BackColor)) {
|
|
g.FillRectangle(bBackColor, ClientRectangle);
|
|
}
|
|
|
|
Region region = g.Clip;
|
|
|
|
for (int i = 0; i < TabCount; i++) {
|
|
DrawTab(g, TabPages[i], i);
|
|
TabPages[i].BackColor = TabColor;
|
|
}
|
|
|
|
g.Clip = region;
|
|
|
|
using (Pen border = new Pen(BorderColor)) {
|
|
g.DrawRectangle(border, clientRectangle);
|
|
|
|
if (SelectedTab != null) {
|
|
clientRectangle.Offset(1, 1);
|
|
clientRectangle.Width -= 2;
|
|
clientRectangle.Height -= 2;
|
|
g.DrawRectangle(border, clientRectangle);
|
|
clientRectangle.Width -= 1;
|
|
clientRectangle.Height -= 1;
|
|
g.DrawRectangle(border, clientRectangle);
|
|
}
|
|
}
|
|
|
|
// a decorative line on top of pages:
|
|
using (Brush bLineColor = new SolidBrush(LineColor)) {
|
|
Rectangle rectangle = ClientRectangle;
|
|
rectangle.Height = 1;
|
|
rectangle.Y = 25;
|
|
g.FillRectangle(bLineColor, rectangle);
|
|
|
|
rectangle = ClientRectangle;
|
|
rectangle.Height = 1;
|
|
rectangle.Y = 26;
|
|
g.FillRectangle(bLineColor, rectangle);
|
|
}
|
|
|
|
} catch { }
|
|
}
|
|
|
|
internal void DrawTab(Graphics g, TabPage customTabPage, int nIndex)
|
|
{
|
|
Rectangle tabRect = GetTabRect(nIndex);
|
|
Rectangle tabTextRect = GetTabRect(nIndex);
|
|
bool isSelected = (SelectedIndex == nIndex);
|
|
Point[] points;
|
|
|
|
if (Alignment == TabAlignment.Top) {
|
|
points = new[]
|
|
{
|
|
new Point(tabRect.Left, tabRect.Bottom),
|
|
new Point(tabRect.Left, tabRect.Top + 0),
|
|
new Point(tabRect.Left + 0, tabRect.Top),
|
|
new Point(tabRect.Right - 0, tabRect.Top),
|
|
new Point(tabRect.Right, tabRect.Top + 0),
|
|
new Point(tabRect.Right, tabRect.Bottom),
|
|
new Point(tabRect.Left, tabRect.Bottom)
|
|
};
|
|
} else {
|
|
points = new[]
|
|
{
|
|
new Point(tabRect.Left, tabRect.Top),
|
|
new Point(tabRect.Right, tabRect.Top),
|
|
new Point(tabRect.Right, tabRect.Bottom - 0),
|
|
new Point(tabRect.Right - 0, tabRect.Bottom),
|
|
new Point(tabRect.Left + 0, tabRect.Bottom),
|
|
new Point(tabRect.Left, tabRect.Bottom - 0),
|
|
new Point(tabRect.Left, tabRect.Top)
|
|
};
|
|
}
|
|
|
|
// Draws the Tab Header:
|
|
Color HeaderColor = isSelected ? SelectTabColor : BackColor;
|
|
using (Brush brush = new SolidBrush(HeaderColor)) {
|
|
g.FillPolygon(brush, points);
|
|
brush.Dispose();
|
|
g.DrawPolygon(new Pen(HeaderColor), points);
|
|
}
|
|
|
|
Rectangle rectangleF = tabTextRect;
|
|
rectangleF.Y += 2;
|
|
|
|
TextRenderer.DrawText(g, customTabPage.Text, Font, rectangleF,
|
|
isSelected ? SelectedForeColor : ForeColor);
|
|
}
|
|
}
|
|
}
|