C# TabControl重写
来源:互联网 发布:ajax怎么解析json数据 编辑:程序博客网 时间:2024/06/05 08:52
看到有很多TabControl类似的控件,界面友好,具有更多的其他功能,比如关闭,所以进行自己上网搜了一下,然后自己进行实践,有了如下内容。如有错误之处,请指正。1.Graphics不懂,看Graphics类详解2.首先了解TabControl这个控件。
属性:
1.Alignment
获取或设置选项卡在其中对齐的控件区域(例如,顶部边缘)。
即选项卡的显示位置。
2.Appearance
获取或设置控件选项卡的可视外观。
即选项卡的样式,TabApperance->Menu;
3.HotTrack
获取或设置一个值,该值指示在鼠标移到控件的选项卡时,这些选项卡是否更改外观。
4.ImageList
获取或设置在控件的选项卡上显示的图像。
5.ItemSize
获取或设置控件的选项卡的大小。
6.RightToLeftLayout
获取或设置一个值,该值指示是否可以显示一行以上的选项卡。
7.RowCount
获取控件的选项卡条中当前正显示的行数。
8.SelectedIndex
获取或设置当前选定的选项卡页的索引
9.SelectedTab
获取或设置当前选定的选项卡页。
10.ShowToolTips
获取或设置一个值,该值指示当鼠标移到选项卡上时是否显示该选项卡的“工具提示”。
11.SizeMode
获取或设置调整控件的选项卡大小的方式。
12.TabCount
获取选项卡条中选项卡的数目。
13.TabPages
获取该选项卡控件中选项卡页的集合。
14.Padding
获取或设置控件的选项卡页上每个项周围的空间量。
函数:
1.DeselectTab
overload
使具有指定索引的选项卡后面的选项卡成为当前选项卡。
2.GetControl
获取指定位置的 System.Windows.Forms.TabPage 控件。
3.GetItems
获取一个由属于 System.Windows.Forms.TabControl 控件的 System.Windows.Forms.TabPage 控件构成的数组。
4.GetTabRect
返回该选项卡控件中的指定选项卡的边框。
5.GetToolTipText
获取指定的 System.Windows.Forms.TabPage 的工具提示。
6.RemoveAll
从该选项卡控件中移除所有的选项卡页和附加的控件
7.SelectTab
overload
使具有指定索引的选项卡成为当前选项卡。
事件:
1.DrawItem
如果 System.Windows.Forms.TabControl.DrawMode 属性设置为 System.Windows.Forms.TabDrawMode.OwnerDrawFixed,则当System.Windows.Forms.TabControl 需要绘制它的每一个选项卡时发生。
2.Deselected
如果 System.Windows.Forms.TabControl.DrawMode 属性设置为 System.Windows.Forms.TabDrawMode.OwnerDrawFixed,则当 System.Windows.Forms.TabControl 需要绘制它的每一个选项卡时发生。
3.SelectedIndexChanged
在 System.Windows.Forms.TabControl.SelectedIndex 属性更改后发生。
4.Selected
当选择某个选项卡时发生。
重写代码:
// 构造函数 public TabControlExtern() : base() { base.DrawMode = TabDrawMode.OwnerDrawFixed; //增加DrawItem事件 this.DrawItem += OverridOnDrawItem; //增加MouseDown事件 this.MouseDown += OverridMouseDown; InitializeComponent(); } // 用于实际设置的TabControlMode private TabControlMode _tabControlMode; // 存储控件设置的Padding值 private Point _padding; // 获取或设置绘制控件的选项卡的方式。 [Browsable(true)] [DefaultValue(TabDrawMode.OwnerDrawFixed)] [ReadOnly(true)] public new TabDrawMode DrawMode { get { return base.DrawMode; } } // 选项卡显示的图片 [Browsable(true)] public Image TabImage { get; set; } // TabControl显示方式 [Browsable(true)] [DefaultValue(TabControlMode.Close)] public TabControlMode StyleMode { get { if (_tabControlMode == TabControlMode.Image && this.TabImage == null) _tabControlMode = TabControlMode.Close; return _tabControlMode; } set { _tabControlMode=value; if (_tabControlMode == TabControlMode.Image && this.TabImage == null) _tabControlMode = TabControlMode.Close; } } // 重写父类Padding public new Point Padding { get { switch (this.StyleMode) { case TabControlMode.Normal: case TabControlMode.Close: case TabControlMode.Image: _padding = new Point(base.Padding.X - 4, base.Padding.Y); break; case TabControlMode.All: _padding = new Point((base.Padding.X - 4)/2, base.Padding.Y); break; } return _padding; } set { _padding = value; switch (this.StyleMode) { case TabControlMode.Normal: case TabControlMode.Close: case TabControlMode.Image: base.Padding = new Point(_padding.X + 4, _padding.Y); break; case TabControlMode.All: base.Padding = new Point(_padding.X * 2 + 4, _padding.Y); break; } } } // 被选中的选择项的背景色 [Browsable(true)] public Color BackGroundColor { get; set; } //MosuDown事件,关闭选项卡,此处有点复杂化,使用变量可以在DrawItem中对被选中的TabPage进行赋值操作。 private void OverridMouseDown(object sender, MouseEventArgs e) { if (this.StyleMode ==TabControlMode.Image || e.Button != MouseButtons.Left ) return; Rectangle selectedRec = this.GetTabRect(this.SelectedIndex); int width, yValue; double dValue; width = base.Padding.X * 2 > selectedRec.Height ? selectedRec.Height - 4 : base.Padding.X * 2 - 4; dValue = (selectedRec.Height - width) / 2; yValue = Convert.ToInt32(Math.Round(dValue)); switch (this.StyleMode) { case TabControlMode.Normal: case TabControlMode.Close: selectedRec.X = selectedRec.X + selectedRec.Width - width - 2; selectedRec.Y = selectedRec.Y - yValue; selectedRec.Width = selectedRec.Height = width; break; case TabControlMode.Image: break; case TabControlMode.All: width = selectedRec.Height = base.Padding.X > selectedRec.Height ? selectedRec.Height - 2 : base.Padding.X - 2; selectedRec.X = selectedRec.X + selectedRec.Width - width - 2; selectedRec.Y = selectedRec.Y + yValue; break; } if (e.X >= selectedRec.X && e.X <= selectedRec.X + width && e.Y >= selectedRec.Y && e.Y <= selectedRec.Y + width) this.TabPages.RemoveAt(this.SelectedIndex); } private void OverridOnDrawItem(object sender, DrawItemEventArgs e) { //获取当前选项卡 Rectangle rec = this.GetTabRect(e.Index); //创建新的Rectangle Rectangle newRec = new Rectangle(); int newRecWidth,yValue; //计算关闭按钮大小 newRecWidth = base.Padding.X * 2 > rec.Height ? rec.Height - 4 : base.Padding.X * 2 - 4; //计算垂直坐标 double dValue = (rec.Height - newRecWidth) / 2; yValue = Convert.ToInt32(Math.Round(dValue)); if (e.Index == this.SelectedIndex) { //进行填充背景色 e.Graphics.FillRectangle(new SolidBrush(BackGroundColor), rec); } switch (this.StyleMode) { case TabControlMode.Normal: case TabControlMode.Close: #region Normal,Close //绘制文字 e.Graphics.DrawString(this.TabPages[e.Index].Text, this.Font, new SolidBrush(this.TabPages[e.Index].ForeColor), rec.X - 1, rec.Y + base.Padding.Y); //计算close的Rectangle newRec.Width = newRec.Height = newRecWidth; newRec.X = rec.X + rec.Width - newRec.Width - 2; newRec.Y = rec.Y + yValue; //绘制关闭按钮方框 e.Graphics.DrawRectangle(Pens.Black, newRec); //绘制关闭按钮颜色,Color.FromArgb将10进制的8 位颜色值 e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(191, 83, 62)), new Rectangle(newRec.X + 1, newRec.Y + 1, newRec.Width - 1, newRec.Height - 1)); //绘制关闭的X e.Graphics.DrawLine(new Pen(Color.White) { Width = 2 }, newRec.X + 4, newRec.Y + 4, newRec.X + newRec.Width - 4, newRec.Y + newRec.Height - 4); e.Graphics.DrawLine(new Pen(Color.White) { Width = 2 }, newRec.X + 4, newRec.Y + newRec.Height - 4, newRec.X + newRec.Width - 4, newRec.Y + 4); break; #endregion case TabControlMode.Image: #region Image //计算image的Rectangle newRec.Width = newRec.Height = newRecWidth; newRec.X = rec.X + 1; newRec.Y = rec.Y + yValue; //绘制图片 e.Graphics.DrawImage(this.TabImage, newRec); //绘制文字 e.Graphics.DrawString(this.TabPages[e.Index].Text, this.Font, new SolidBrush(this.TabPages[e.Index].ForeColor), newRec.X + newRec.Width + 1, rec.Y + base.Padding.Y); break; #endregion case TabControlMode.All: #region All //计算image的Rectangle newRec.Width = newRec.Height = base.Padding.X > rec.Height ? rec.Height - 2 : base.Padding.X - 2; newRec.X = rec.X + 1; newRec.Y = rec.Y + yValue; //绘制图片 e.Graphics.DrawImage(this.TabImage, newRec); //绘制文字 e.Graphics.DrawString(this.TabPages[e.Index].Text, this.Font, new SolidBrush(this.TabPages[e.Index].ForeColor), newRec.X + newRec.Width + 1, rec.Y + base.Padding.Y); //计算close的Rectangle newRec.X = rec.X + rec.Width - newRec.Width - 2; //绘制关闭按钮颜色,Color.FromArgb将10进制的8 位颜色值 e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(191, 83, 62)),newRec); //绘制关闭的X e.Graphics.DrawLine(new Pen(Color.White) { Width = 2 }, newRec.X + 4, newRec.Y + 4, newRec.X + newRec.Width - 4, newRec.Y + newRec.Height - 4); e.Graphics.DrawLine(new Pen(Color.White) { Width = 2 }, newRec.X + 4, newRec.Y + newRec.Height - 4, newRec.X + newRec.Width - 4, newRec.Y + 4); break; #endregion } } /// <summary> /// TabControl显示方式 /// </summary> public enum TabControlMode { /// <summary> /// 效果与TabControl一致 /// </summary> Normal = 0, /// <summary> /// 具有关闭功能 /// </summary> Close = 1, /// <summary> /// 具有图片功能 /// </summary> Image = 2, /// <summary> /// 同时具有关闭和图片功能 /// </summary> All = 3 }
最终效果:(http://img.blog.csdn.net/20170729212025658?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ194dWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
- C# TabControl重写
- 【转】c#重写一个TabControl
- c#重写TabControl控件实现关闭按钮
- c#重写TabControl控件实现关闭按钮的方法
- C# tabcontrol
- C# TabControl
- C# TabControl左右形式
- C# TabConTrol颜色
- C#隐藏Tabcontrol标签
- 详细教你如何重写tabcontrol控件
- C# Tabcontrol 中textbox focus
- C# TabConTrol控件背景颜色
- tabcontrol
- TabControl
- TabControl
- TabControl
- TabControl
- C#重写
- JAVA基础10 Object类和String类
- bzoj 1189 紧急疏散 网络流
- HDU-1560 DNA sequence (迭代深搜)
- Linux修改/etc/profile导致卡在登陆界面
- python_对象整理
- C# TabControl重写
- hdu6053 TrickGCD
- 最高指挥官
- 【每日一题-12】平衡二叉树/镜像与杨氏矩阵查找
- LINUX grep练习题
- poj1729(bfs+优先队列优化)
- Thread类的常用方法
- C++之开始学习C++
- HDU-4649 Professor Tian(期望dp)