using System;
|
using System.ComponentModel;
|
using System.Drawing;
|
using System.Windows.Forms;
|
namespace DPumpHydr.WinFrmUI.WenSkin.Controls
|
{
|
[ToolboxBitmap(typeof(TabControl))]
|
public partial class WenTabControl : System.Windows.Forms.TabControl
|
{
|
public WenTabControl() : base()
|
{
|
this.DrawMode = TabDrawMode.OwnerDrawFixed;
|
this.SizeMode = TabSizeMode.Fixed;
|
this.ItemSize = new Size(120, 25);
|
|
base.SetStyle(
|
ControlStyles.UserPaint |
|
ControlStyles.DoubleBuffer |
|
ControlStyles.OptimizedDoubleBuffer |
|
ControlStyles.AllPaintingInWmPaint |
|
ControlStyles.ResizeRedraw |
|
ControlStyles.SupportsTransparentBackColor, true);
|
base.UpdateStyles();
|
}
|
|
#region 私有属性
|
|
private int mouseMovePageIndex = -1;
|
private bool mouseMovePageColse = false;
|
private bool closeButtonEnable = true;
|
private bool iconEnable=false;
|
|
#endregion
|
|
#region 公有属性
|
|
[Category("Wen")]
|
[Description("背景图片")]
|
public Image BackImage { get; set; }
|
|
[Category("Wen"), Description("是否显示关闭按钮")]
|
public bool CloseButtonEnable { get => closeButtonEnable; set { closeButtonEnable = value; this.Invalidate(); } }
|
|
[Category("Wen"), Description("是否显示图标"), DefaultValue(false)]
|
public bool IconEnable { get => iconEnable; set => iconEnable = value; }
|
#endregion
|
|
protected override void OnPaint(PaintEventArgs e)
|
{
|
Graphics g = e.Graphics;
|
g.SetGDIHigh();
|
//base.OnPaint(e);
|
Rectangle rec = this.ClientRectangle;
|
|
Control control = this.Parent;
|
Color color = control.BackColor;
|
Brush brush = new SolidBrush(color);
|
|
if (BackImage != null)
|
{
|
g.DrawImage(BackImage, new Rectangle(-2, -2, this.Width + 4, this.Height + 4));
|
}
|
else
|
{
|
g.FillRectangle(brush, new Rectangle(-2, -2, this.Width + 4, this.Height + 4));
|
}
|
StringFormat stringFormat = new StringFormat(StringFormatFlags.NoWrap)
|
{
|
Alignment = StringAlignment.Near,
|
LineAlignment = StringAlignment.Center
|
};
|
|
//画一条长底纹实线条
|
Rectangle recLine = new Rectangle(0, this.ItemSize.Height + 2, this.Width, 1);
|
using (Brush b = new SolidBrush(Color.FromArgb(0, 122, 204)))
|
{
|
g.FillRectangle(b, recLine);
|
}
|
|
|
//获取当前选中项目索引
|
int selectIndex = this.SelectedIndex;
|
foreach (TabPage tab in this.TabPages)
|
{
|
int index = this.TabPages.IndexOf(tab);
|
Rectangle rectab = this.GetTabRect(index);
|
|
//背景颜色
|
Brush back = new SolidBrush(color);
|
|
if (index == selectIndex)
|
back = new SolidBrush(Color.FromArgb(0, 122, 204));
|
|
//绘制选中底纹
|
g.FillRectangle(back, rectab);
|
|
////绘制文字区域
|
//Rectangle recStr = new Rectangle(rectab.X, rectab.Y, rectab.Width - 20, rectab.Height);
|
////绘制文字
|
//g.DrawString(tab.Text, tab.Font, new SolidBrush(tab.ForeColor), recStr, stringFormat);
|
|
ImageIcoOrText(tab, g, rectab);
|
|
//绘制关闭按钮
|
if (index == selectIndex)
|
CloseButton(g, rectab, false);
|
|
//注销内存
|
back.Dispose();
|
}
|
stringFormat.Dispose();
|
}
|
|
//画tab图标和文字
|
private void ImageIcoOrText(TabPage tabPage, Graphics g, Rectangle rec)
|
{
|
StringFormat stringFormat = new StringFormat(StringFormatFlags.NoWrap)
|
{
|
Alignment = StringAlignment.Near,
|
LineAlignment = StringAlignment.Center
|
};
|
if (IconEnable && tabPage is WenTabPage page && page.Image != null)
|
{
|
//绘制图标区域
|
Rectangle recimage = new Rectangle(rec.X + 3, rec.Y + (rec.Height - 16) / 2, 16, 16);
|
g.DrawImage(page.Image, recimage);
|
|
//绘制文字区域
|
Rectangle recStr = new Rectangle(recimage.X + recimage.Width + 3, rec.Y, rec.Width - 20 - (recimage.Width + 6), rec.Height);
|
g.DrawString(page.Text, page.Font, new SolidBrush(page.ForeColor), recStr, stringFormat);
|
}
|
else
|
{
|
//绘制文字区域
|
Rectangle recStr = new Rectangle(rec.X, rec.Y, rec.Width - 20, rec.Height);
|
//绘制文字
|
g.DrawString(tabPage.Text, tabPage.Font, new SolidBrush(tabPage.ForeColor), recStr, stringFormat);
|
}
|
}
|
|
//关闭按钮功能
|
protected override void OnMouseDown(MouseEventArgs e)
|
{
|
base.OnMouseDown(e);
|
|
//关闭按钮不显示,功能取消
|
if (!closeButtonEnable)
|
return;
|
|
if (e.Button == MouseButtons.Left)
|
{
|
if (mouseMovePageColse && mouseMovePageIndex > -1)
|
{
|
this.TabPages.RemoveAt(mouseMovePageIndex);
|
}
|
}
|
}
|
|
//绘制关闭按钮
|
private void CloseButton(Graphics g, Rectangle rec, bool close)
|
{
|
//当不显示关闭按钮直接返回
|
if (!closeButtonEnable)
|
return;
|
|
int closeSize = 8;
|
|
//获取关闭按钮Y需要移动区域 便于按钮居中
|
int yMove = (ItemSize.Height - closeSize) / 2;
|
|
//偏移矩形框
|
rec.Offset(rec.Width - closeSize - 5, yMove);
|
//重新设置矩形框的大小
|
rec.Width = closeSize;
|
rec.Height = closeSize;
|
|
//如果关闭为True绘制圆圈背景效果
|
if (close)
|
g.FillEllipse(Brushes.DarkGray, rec.X - 4, rec.Y - 4, 16, 16);
|
|
//用DrawLine绘制两条线段 实现X 样子效果
|
using Pen pen = new Pen(Color.Gray)
|
{
|
Width = 2
|
};
|
g.DrawLine(pen, rec.X, rec.Y, rec.X + closeSize, rec.Y + closeSize);
|
g.DrawLine(pen, rec.X, rec.Y + closeSize, rec.X + closeSize, rec.Y);
|
}
|
//鼠标移动事件
|
protected override void OnMouseMove(MouseEventArgs e)
|
{
|
base.OnMouseMove(e);
|
|
int beforeMouseIndex = mouseMovePageIndex;
|
foreach (TabPage tab in this.TabPages)
|
{
|
int index = this.TabPages.IndexOf(tab);
|
if (this.GetTabRect(index).Contains(e.Location))
|
{
|
mouseMovePageIndex = index;
|
}
|
}
|
|
if (mouseMovePageIndex == -1 || mouseMovePageIndex >= this.TabPages.Count)
|
return;
|
//获取关闭区域
|
int closeSize = 20;
|
Rectangle rec = this.GetTabRect(mouseMovePageIndex);
|
|
//检查关闭区域
|
Rectangle recClose = this.GetTabRect(mouseMovePageIndex);
|
recClose.Offset(recClose.Width - closeSize, 4);
|
recClose.Width = closeSize;
|
recClose.Height = closeSize;
|
|
bool mouseMovePageColse = this.mouseMovePageColse;
|
|
if (recClose.Contains(e.Location))
|
{
|
this.mouseMovePageColse = true;
|
}
|
else
|
{
|
this.mouseMovePageColse = false;
|
}
|
|
//判定鼠标是否已经改变项
|
if (beforeMouseIndex == mouseMovePageIndex && mouseMovePageColse == this.mouseMovePageColse)
|
{
|
return;
|
}
|
|
Graphics g = this.CreateGraphics();
|
g.SetClip(new Rectangle(rec.X + 1, rec.Y + 1, rec.Width - 2, rec.Height - 2));
|
//鼠标移动改变两处重绘
|
if (this.mouseMovePageColse)
|
{
|
DrawTabPageLable(g, this.TabPages[mouseMovePageIndex], rec, Color.FromArgb(28, 151, 234), true);
|
}
|
else
|
{
|
DrawTabPageLable(g, this.TabPages[mouseMovePageIndex], rec, Color.FromArgb(28, 151, 234), false);
|
}
|
|
int selectIndex = this.SelectedIndex;
|
Control control = this.Parent;
|
Color color = control.BackColor;
|
|
if (beforeMouseIndex == selectIndex)
|
color = Color.DodgerBlue;
|
|
//改变后的上一个信息
|
if (beforeMouseIndex != -1 && beforeMouseIndex != mouseMovePageIndex && beforeMouseIndex < this.TabPages.Count)
|
{
|
Rectangle recBefore = this.GetTabRect(beforeMouseIndex);
|
g.SetClip(recBefore);
|
DrawTabPageLable(g, this.TabPages[beforeMouseIndex], recBefore, color, null);
|
}
|
}
|
|
//画标签
|
private void DrawTabPageLable(Graphics g, TabPage tab, Rectangle rec, Color color, bool? colse)
|
{
|
g.SetGDIHigh();
|
using StringFormat stringFormat = new StringFormat(StringFormatFlags.NoWrap)
|
{
|
Alignment = StringAlignment.Near,
|
LineAlignment = StringAlignment.Center
|
};
|
|
//声明画笔
|
using Brush brushe = new SolidBrush(color);
|
using Brush brusheStr = new SolidBrush(tab.ForeColor);
|
//绘制选中底纹
|
g.FillRectangle(brushe, rec);
|
|
////绘制文字区域
|
//Rectangle recStr = new Rectangle(rec.X, rec.Y, rec.Width - 20, rec.Height);
|
////绘制文字
|
//g.DrawString(tab.Text, tab.Font, brusheStr, recStr, stringFormat);
|
|
ImageIcoOrText(tab, g, rec);
|
|
//绘制关闭按钮
|
if (colse == null)
|
{
|
if (this.SelectedTab == tab)
|
{
|
CloseButton(g, rec, false);
|
}
|
return;
|
}
|
|
if (colse == true)
|
CloseButton(g, rec, true);
|
else
|
CloseButton(g, rec, false);
|
|
}
|
|
//鼠标离开事件
|
protected override void OnMouseLeave(EventArgs e)
|
{
|
base.OnMouseLeave(e);
|
|
if (mouseMovePageIndex == -1 || mouseMovePageIndex >= this.TabPages.Count)
|
return;
|
|
Graphics g = this.CreateGraphics();
|
|
int selectIndex = this.SelectedIndex;
|
Control control = this.Parent;
|
Color color = control.BackColor;
|
|
if (mouseMovePageIndex == selectIndex)
|
color = Color.DodgerBlue;
|
//设置rec大小
|
Rectangle recBefore = this.GetTabRect(mouseMovePageIndex);
|
g.SetClip(recBefore);
|
|
DrawTabPageLable(g, this.TabPages[mouseMovePageIndex], recBefore, color, null);
|
mouseMovePageIndex = -1;
|
}
|
|
protected override void OnControlRemoved(ControlEventArgs e)
|
{
|
base.OnControlRemoved(e);
|
mouseMovePageIndex = -1;
|
}
|
}
|
}
|