|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
-
- namespace CNAS_RunSync
- {
- public partial class KMenuTabControl : System.Windows.Forms.TabControl
- {
- #region 属性、构造
- Color SelectedColor = Color.FromArgb(235,235,235);
- Color MoveColor = Color.FromArgb(225, 225, 225);
- Color FontColor = Color.Black;
- int TextLeft = 10;
- [Browsable(true)]
- [Description("选项卡标题左边距"), Category("TextLeft"), DefaultValue(typeof(Int32), "10")]
- public int TitleTextLeft
- {
- get { return TextLeft; }
- set { this.TextLeft = value; }
- }
-
- [Browsable(true)]
- [Description("选项卡标题字体颜色"), Category("TitleColor"), DefaultValue(typeof(Color), "Black")]
- public Color TitleFontColor
- {
- get { return FontColor; }
- set { this.FontColor = value; }
- }
-
- [Browsable(true)]
- [Description("选项卡标题字体选中颜色"), Category("TitleColor"), DefaultValue(typeof(Color), "LightSkyBlue")]
- public Color TitleSelectedColor
- {
- get { return SelectedColor; }
- set { this.SelectedColor = value; }
- }
-
- [Browsable(true)]
- [Description("选项卡标题字体悬浮颜色"), Category("TitleColor"), DefaultValue(typeof(Color), "White")]
- public Color TitleMoveColor
- {
- get { return MoveColor; }
- set { this.MoveColor = value; }
- }
-
- [Browsable(true), Description("整个控件的背景色"), Category("外观")]
- public Color TabControlBackColor { get; set; }
-
- [Browsable(true), Description("TabControl ItemSize"), Category("外观")]
- public Size TabControlItemSize { get; set; }
-
- public KMenuTabControl()
- {
- this.SuspendLayout();
- this.DrawMode = TabDrawMode.OwnerDrawFixed;
- this.ResumeLayout(false);
- this.SizeMode = TabSizeMode.Fixed;
- this.Multiline = false;
- this.TabControlBackColor = Color.WhiteSmoke;
- this.TabControlItemSize = new Size(100, 28);
- this.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tabMenu_DrawItem);
- this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MainTabControl_MouseDown);
- }
- #endregion
-
- protected override void OnPaint(PaintEventArgs e)
- {
- Rectangle tcRec = this.ClientRectangle;//整个tabControl的边框
- e.Graphics.FillRectangle(new SolidBrush(this.TabControlBackColor), tcRec);
-
- int MaxWidth = 100;
- for (int i = 0; i < this.TabCount; i++)
- {
- Graphics gx = Graphics.FromImage(new Bitmap(1, 1));
- SizeF size = gx.MeasureString(this.Controls[i].Text, this.Font);
- if (MaxWidth < (int)size.Width + 30)
- MaxWidth = (int)size.Width + 30;
- }
- this.TabControlItemSize = new Size(MaxWidth, this.TabControlItemSize.Height);
- if (this.ItemSize != this.TabControlItemSize)
- {
- this.ItemSize = TabControlItemSize;
- }
-
- StringFormat sf = new StringFormat();//封装文本布局信息
- sf.LineAlignment = StringAlignment.Center;
- sf.Alignment = StringAlignment.Near;
- for (int i = 0; i < this.TabCount; i++)
- {
- Graphics g = e.Graphics;
- // int width = (int)g.MeasureString(this.Controls[i].Text, this.Font).Width + 40;
- Rectangle rect = this.GetTabRect(i);
- // rect.Width = width;
- if (this.SelectedIndex == i)
- g.FillRectangle(new SolidBrush(MoveColor), rect);
- else
- g.FillRectangle(new SolidBrush(SelectedColor), rect);
-
- SolidBrush brush = new SolidBrush(FontColor);
- // rect.Width = width;
- rect.X += TextLeft;
- g.DrawString(this.Controls[i].Text, this.Font, brush, rect, sf);
-
- using (Pen objpen = new Pen(Color.Black))
- {
- int tx = (int)(rect.X + (rect.Width - 30));
- rect.X = tx - 2;
- Point p5 = new Point(tx, 8);
- Font font = new System.Drawing.Font("微软雅黑", 12);
- //g.DrawString("〇", font, brush, rect, sf);
- font = new System.Drawing.Font("微软雅黑", 11);
- rect.X = tx + 2;
- rect.Y = rect.Y - 1;
- g.DrawString("×", font, brush, rect, sf);
- }
- }
- }
-
- public override Rectangle DisplayRectangle
- {
- get
- {
- Rectangle rect = base.DisplayRectangle;
- return new Rectangle(rect.Left - 2, rect.Top - 2, rect.Width + 4, rect.Height + 5);
- }
- }
-
- int index = -1;
- protected override void OnMouseMove(MouseEventArgs e)
- {
- int Count = 0;
- try
- {
- Graphics g = this.CreateGraphics();
- SolidBrush brush = new SolidBrush(FontColor);
- StringFormat sf = new StringFormat();//封装文本布局信息
- sf.LineAlignment = StringAlignment.Center;
- sf.Alignment = StringAlignment.Near;
-
- for (int i = 0; i < this.TabPages.Count; i++)
- {
- TabPage tp = this.TabPages[i];
- if (this.GetTabRect(i).Contains(e.Location) && tp != this.SelectedTab)
- {
- if (index != i)
- {
- if (Count == 0)
- {
- if (index != -1 && this.TabPages[index] != this.SelectedTab)
- {
- g.FillRectangle(new SolidBrush(SelectedColor), this.GetTabRect(index));
-
- RectangleF tRectangle = this.GetTabRect(index);
- tRectangle.X += TextLeft;
- g.DrawString(this.Controls[index].Text, this.Font, brush, tRectangle, sf);
- }
- Count = 1;
- }
- index = i;
- g.FillRectangle(new SolidBrush(SelectedColor), this.GetTabRect(i));
- RectangleF tRectangleF = this.GetTabRect(i);
- tRectangleF.X += TextLeft;
- g.DrawString(this.Controls[i].Text, this.Font, brush, tRectangleF, sf);
- using (Pen objpen = new Pen(Color.Black))
- {
- int tx = (int)(tRectangleF.X + (tRectangleF.Width - 30));
- tRectangleF.X = tx - 2;
- brush.Color = Color.White;
- Font font = new System.Drawing.Font("微软雅黑", 12);
- //g.DrawString("〇", font, brush, tRectangleF, sf);
- font = new System.Drawing.Font("微软雅黑", 11);
- tRectangleF.X = tx + 2;
- tRectangleF.Y = tRectangleF.Y - 1;
- g.DrawString("×", font, brush, tRectangleF, sf);
- }
- }
- }
- if (this.GetTabRect(i).Contains(e.Location) && tp == this.SelectedTab)
- {
- if (index != -1 && index != this.SelectedIndex)
- {
- g.FillRectangle(new SolidBrush(SelectedColor), this.GetTabRect(index));
- RectangleF tRectangleF = this.GetTabRect(index);
- tRectangleF.X += TextLeft;
- g.DrawString(this.Controls[index].Text, this.Font, brush, tRectangleF, sf);
- using (Pen objpen = new Pen(Color.Black))
- {
- int tx = (int)(tRectangleF.X + (tRectangleF.Width - 30));
- tRectangleF.X = tx - 2;
- Font font = new System.Drawing.Font("微软雅黑", 12);
- //g.DrawString("〇", font, brush, tRectangleF, sf);
- font = new System.Drawing.Font("微软雅黑", 11);
- tRectangleF.X = tx + 2;
- tRectangleF.Y = tRectangleF.Y - 1;
- g.DrawString("×", font, brush, tRectangleF, sf);
- }
- }
- index = -1;
- }
- }
- }
- catch (Exception)
- {
- }
- Count = 0;
- base.OnMouseMove(e);
- }
-
- protected override void OnMouseLeave(EventArgs e)
- {
- try
- {
- Graphics g = this.CreateGraphics();
- if (index != -1 && this.TabPages[index] != this.SelectedTab)
- {
- g.FillRectangle(new SolidBrush(SelectedColor), this.GetTabRect(index));
- SolidBrush brush = new SolidBrush(FontColor);
- RectangleF tRectangleF = this.GetTabRect(index);
- StringFormat sf = new StringFormat();//封装文本布局信息
- sf.LineAlignment = StringAlignment.Center;
- sf.Alignment = StringAlignment.Near;
- tRectangleF.X += TextLeft;
- g.DrawString(this.Controls[index].Text, this.Font, brush, tRectangleF, sf);
- using (Pen objpen = new Pen(Color.Black))
- {
- int tx = (int)(tRectangleF.X + (tRectangleF.Width - 30));
- tRectangleF.X = tx - 2;
- Point p5 = new Point(tx, 8);
- Font font = new System.Drawing.Font("微软雅黑", 12);
- //g.DrawString("〇", font, brush, tRectangleF, sf);
- font = new System.Drawing.Font("微软雅黑", 11);
- tRectangleF.X = tx + 2;
- tRectangleF.Y = tRectangleF.Y - 1;
- g.DrawString("×", font, brush, tRectangleF, sf);
- }
- }
- }
- catch (Exception)
- {
- }
- index = -1;
- base.OnMouseLeave(e);
- }
- /// <summary>
- /// 重绘控件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void tabMenu_DrawItem(object sender, DrawItemEventArgs e)
- {
- this.SetStyle(
- ControlStyles.UserPaint | // 控件将自行绘制,而不是通过操作系统来绘制
- ControlStyles.OptimizedDoubleBuffer | // 该控件首先在缓冲区中绘制,而不是直接绘制到屏幕上,这样可以减少闪烁
- ControlStyles.AllPaintingInWmPaint | // 控件将忽略 WM_ERASEBKGND 窗口消息以减少闪烁
- ControlStyles.ResizeRedraw | // 在调整控件大小时重绘控件
- ControlStyles.SupportsTransparentBackColor, // 控件接受 alpha 组件小于 255 的 BackColor 以模拟透明
- true); // 设置以上值为 true
- this.UpdateStyles();
- }
-
- //关闭按钮功能
- private void MainTabControl_MouseDown(object sender, MouseEventArgs e)
- {
- int closeSize = 20;
- if (e.Button == MouseButtons.Left)
- {
- int x = e.X, y = e.Y;
- //计算关闭区域
- Rectangle tab = this.GetTabRect(this.SelectedIndex);
- tab.Offset(tab.Width - (closeSize + 3), 4);
- tab.Width = closeSize;
- tab.Height = closeSize;
-
- if (this.TabCount == 1) return;
-
- //如果鼠标在区域内就关闭选项卡
- bool isClose = x > tab.X && x < tab.Right && y > tab.Y && y < tab.Bottom;
- if (isClose == true)
- {
- this.TabPages.Remove(this.SelectedTab);
- }
- }
- }
- }
-
-
- public partial class KTabControl : System.Windows.Forms.TabControl
- {
- [Browsable(true), Description("整个控件的背景色"), Category("外观")]
- public Color TabControlBackColor { get; set; }
-
- [Browsable(true), Description("Tab的标题栏边框颜色"), Category("外观")]
- public Color TabBorderColor { get; set; }
-
- [Browsable(true), Description("当前激活Tab的标题栏背景色"), Category("外观")]
- public Color ActivedTabBackColor { get; set; }
-
- [Browsable(true), Description("当前激活Tab的标题文字颜色"), Category("外观")]
- public Color ActivedTabLabelColor { get; set; }
-
- [Browsable(true), Description("未激活Tab的标题栏背景色"), Category("外观")]
- public Color InActivedTabBackColor { get; set; }
-
- [Browsable(true), Description("未激活Tab的标题文字颜色"), Category("外观")]
- public Color InActivedTabLabelColor { get; set; }
-
- [Browsable(true), Description("Tab标题栏的大小"), Category("外观")]
- public Size TabSize { get; set; }
-
- public KTabControl()
- {
- //this.InitializeComponent();
-
- TabSet();
-
- this.TabBorderColor = Color.Black;
- this.ActivedTabLabelColor = Color.Black;
- this.InActivedTabLabelColor = Color.Black;
- this.ActivedTabBackColor = Color.White;
- this.InActivedTabBackColor = Color.FromArgb(0, 192, 192);
- this.TabControlBackColor = Color.Transparent;
- this.TabSize = new Size(100, 35);
- }
-
- protected override void OnMouseDoubleClick(MouseEventArgs e)
- {
- if (this.TabPages.Count == 1) return;
- this.TabPages.RemoveAt(this.SelectedIndex);
- }
-
- protected override void OnPaint(PaintEventArgs e)
- {
- Rectangle tcRec = this.ClientRectangle;//整个tabControl的边框
- e.Graphics.FillRectangle(new SolidBrush(this.TabControlBackColor), tcRec);
-
- for (int i = 0; i < this.TabPages.Count; i++)
- {
- Rectangle tabRectangle = new Rectangle(1, 1 + i * TabSize.Height, TabSize.Width, TabSize.Height);
- SolidBrush brush = new SolidBrush(this.InActivedTabLabelColor);
- StringFormat sf = new StringFormat();//封装文本布局信息
- sf.LineAlignment = StringAlignment.Center;
- sf.Alignment = StringAlignment.Center;
- if (i == this.SelectedIndex)
- {
- brush = new SolidBrush(this.ActivedTabLabelColor);
- e.Graphics.FillRectangle(new SolidBrush(ActivedTabBackColor), tabRectangle);
- e.Graphics.DrawRectangle(new Pen(this.TabBorderColor), tabRectangle);
- }
- else
- {
- e.Graphics.FillRectangle(new SolidBrush(InActivedTabBackColor), tabRectangle);
- e.Graphics.DrawRectangle(new Pen(this.TabBorderColor), tabRectangle);
- }
- e.Graphics.DrawString(this.Controls[i].Text, this.Font, brush, tabRectangle, sf);
- }
- }
-
- /// <summary>
- /// 设定控件绘制模式
- /// </summary>
- private void TabSet()
- {
- this.DrawMode = TabDrawMode.OwnerDrawFixed;
- this.Alignment = TabAlignment.Left;
- this.SizeMode = TabSizeMode.Fixed;
- this.Multiline = true;
- base.SetStyle(
- ControlStyles.UserPaint |
- ControlStyles.OptimizedDoubleBuffer |
- ControlStyles.AllPaintingInWmPaint |
- ControlStyles.ResizeRedraw |
- ControlStyles.SupportsTransparentBackColor,
- true);
- base.UpdateStyles();
- }
-
- public override Rectangle DisplayRectangle
- {
- get
- {
- Rectangle rect = base.DisplayRectangle;
- return new Rectangle(rect.Left - 3, rect.Top - 3, rect.Width + 6, rect.Height + 5);
- }
- }
- }
- }
|