262 lines
8.0 KiB
C#
262 lines
8.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.Drawing.Text;
|
|
using System.ComponentModel;
|
|
|
|
// by conmajia@gmail.com
|
|
|
|
|
|
namespace ryControls
|
|
{
|
|
/// <summary>
|
|
/// 多标签控件
|
|
/// </summary>
|
|
[ToolboxBitmap(typeof(System.Windows.Forms.TabControl))]
|
|
public class TabControlEx : TabControl
|
|
{
|
|
#region Status Variables
|
|
readonly bool mouseDown = false;
|
|
//bool hijackParent = false;
|
|
#endregion
|
|
|
|
#region Graphics Variables
|
|
Image icon;
|
|
ImageAttributes ia;
|
|
readonly ColorMatrix cm;
|
|
readonly float[][] colorMatrix ={
|
|
new float[]{0.299f, 0.299f, 0.299f, 0, 0},
|
|
new float[]{0.587f, 0.587f, 0.587f, 0, 0},
|
|
new float[]{0.114f, 0.114f, 0.114f, 0, 0},
|
|
new float[]{0, 0, 0, 1, 0},
|
|
new float[]{0, 0, 0, 1, 0}};
|
|
#endregion
|
|
|
|
#region Objects
|
|
//Form parent;
|
|
//int FORM_DELTA = 20;
|
|
//int elapsed = 0;
|
|
//Timer timer;
|
|
//int lastLowerBound = 0;
|
|
//int currentLowerBound = 0;
|
|
#endregion
|
|
|
|
#region Properties
|
|
#endregion
|
|
|
|
#region Initiates
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public TabControlEx()
|
|
{
|
|
SetStyles();
|
|
|
|
ia = new ImageAttributes();
|
|
cm = new ColorMatrix(colorMatrix);
|
|
ia.SetColorMatrix(cm, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
|
|
icon = new Bitmap(1, 1);
|
|
TabBackground = new Bitmap(this.GetType(), "TabButtonBackground.bmp");
|
|
//this.ItemSize = new Size(44, tabBackground.Height);
|
|
}
|
|
private TabBar tabbar;
|
|
/// <summary>
|
|
/// 获取对应的标签
|
|
/// </summary>
|
|
[Browsable(false)]
|
|
public TabBar TabBar
|
|
{
|
|
get
|
|
{
|
|
return this.tabbar;
|
|
}
|
|
}
|
|
internal TabBar InternalTabBar
|
|
{
|
|
get
|
|
{
|
|
return this.tabbar;
|
|
}
|
|
|
|
set
|
|
{
|
|
this.tabbar = value;
|
|
}
|
|
}
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public Image TabBackground { get; set; }
|
|
#endregion
|
|
|
|
#region Private UI Methods
|
|
|
|
private void SetStyles()
|
|
{
|
|
base.SetStyle(
|
|
ControlStyles.UserPaint |
|
|
ControlStyles.OptimizedDoubleBuffer |
|
|
ControlStyles.AllPaintingInWmPaint |
|
|
ControlStyles.ResizeRedraw |
|
|
ControlStyles.SupportsTransparentBackColor,
|
|
true);
|
|
base.UpdateStyles();
|
|
}
|
|
|
|
// 计算控件底线
|
|
private void SetLowBound(Control container)
|
|
{
|
|
int tmp = 0;
|
|
Control c = null;
|
|
for (int i = 0; i < container.Controls.Count; i++)
|
|
{
|
|
c = container.Controls[i];
|
|
if (tmp < c.Bottom)
|
|
tmp = c.Bottom;
|
|
}
|
|
|
|
container.Tag = tmp;
|
|
}
|
|
#endregion
|
|
|
|
#region Tab Overrides
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="e"></param>
|
|
protected override void OnControlAdded(ControlEventArgs e)
|
|
{
|
|
SetLowBound(e.Control);
|
|
}
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="e"></param>
|
|
protected override void OnSelecting(TabControlCancelEventArgs e)
|
|
{
|
|
|
|
}
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="e"></param>
|
|
protected override void OnSelected(TabControlEventArgs e)
|
|
{
|
|
//parent.Text = e.TabPage.Text;
|
|
}
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="e"></param>
|
|
protected override void OnParentChanged(EventArgs e)
|
|
{
|
|
//if (parent == null)
|
|
// parent = this.FindForm();
|
|
|
|
//parent.Text = this.TabPages[0].Text;
|
|
}
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public Color TabBackColor
|
|
{
|
|
get; set;
|
|
} = Color.White;
|
|
#endregion
|
|
#region Paint Override
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="e"></param>
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
Rectangle TabControlArea = this.ClientRectangle;
|
|
|
|
Rectangle TabArea = new Rectangle(3, 24, this.ClientRectangle.Width - 7, this.ClientRectangle.Height - 28);// this.DisplayRectangle;
|
|
|
|
//----------------------------
|
|
// 控件内部颜色
|
|
Brush br = new SolidBrush(TabBackColor);
|
|
|
|
e.Graphics.FillRectangle(br, TabControlArea);
|
|
|
|
br.Dispose();
|
|
e.Graphics.TextRenderingHint
|
|
= TextRenderingHint.AntiAlias;
|
|
|
|
for (int i = 0; i < this.TabCount; i++)
|
|
{
|
|
if (this.SelectedIndex == i)
|
|
{
|
|
if (TabBackground != null)
|
|
e.Graphics.DrawImage(TabBackground, this.GetTabRect(i));
|
|
}
|
|
|
|
if (this.ImageList != null && (this.TabPages[i].ImageIndex > -1 || !string.IsNullOrEmpty(this.TabPages[i].ImageKey)))
|
|
{
|
|
if (this.ImageList.Images.Count > 0)
|
|
{
|
|
if (this.TabPages[i].ImageIndex > -1)
|
|
{
|
|
if (this.TabPages[i].ImageIndex < this.ImageList.Images.Count)
|
|
{
|
|
icon = this.ImageList.Images[this.TabPages[i].ImageIndex];
|
|
}
|
|
else
|
|
{
|
|
//icon = this.ImageList.Images[0];
|
|
}
|
|
}
|
|
else
|
|
if (!string.IsNullOrEmpty(this.TabPages[i].ImageKey) && this.ImageList.Images.ContainsKey(this.TabPages[i].ImageKey))
|
|
icon = this.ImageList.Images[this.TabPages[i].ImageKey];
|
|
|
|
if (mouseDown && (this.SelectedIndex != i))
|
|
e.Graphics.DrawImage(
|
|
icon,
|
|
new Rectangle(
|
|
this.GetTabRect(i).X + (this.GetTabRect(i).Width - icon.Width) / 2,
|
|
this.GetTabRect(i).Y,
|
|
icon.Width,
|
|
icon.Height),
|
|
0,
|
|
0,
|
|
icon.Width,
|
|
icon.Height,
|
|
GraphicsUnit.Pixel,
|
|
ia);
|
|
else
|
|
e.Graphics.DrawImage(
|
|
icon,
|
|
this.GetTabRect(i).X + (this.GetTabRect(i).Width - icon.Width) / 2,
|
|
this.GetTabRect(i).Y);
|
|
}
|
|
|
|
}
|
|
|
|
SizeF textSize
|
|
= e.Graphics.MeasureString(this.TabPages[i].Text, this.Font);
|
|
|
|
e.Graphics.DrawString(
|
|
this.TabPages[i].Text,
|
|
this.Font,
|
|
SystemBrushes.ControlLightLight,
|
|
this.GetTabRect(i).X + (this.GetTabRect(i).Width - textSize.Width) / 2 + 1,
|
|
this.GetTabRect(i).Y + 40);
|
|
|
|
e.Graphics.DrawString(
|
|
this.TabPages[i].Text,
|
|
this.Font,
|
|
SystemBrushes.ControlText,
|
|
this.GetTabRect(i).X + (this.GetTabRect(i).Width - textSize.Width) / 2,
|
|
this.GetTabRect(i).Y + 39);
|
|
}
|
|
}
|
|
#endregion
|
|
}
|
|
}
|