实例一:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms; namespace KUN.CONTROL.LIB.CONTROL
{
public partial class KMenuTabControl : System.Windows.Forms.TabControl
{
#region 属性、构造
Color SelectedColor = Color.LightSkyBlue;
Color MoveColor = Color.LightSeaGreen;
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 = true;
this.TabControlBackColor = Color.SeaShell;
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);
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);
}
}
} }
}

实例二:

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms; namespace KUN.CONTROL.LIB.CONTROL
{
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);
}
}
}
}

  

C# Winfrom TabControl美化的更多相关文章

  1. C# Winfrom UI 美化

    Winfrom UI 美化 此处只做演示,未进行页面布局.... 1.CSkin:此处只显示一种样式供参考,可继承其他样式——略 2.MetroFramework.Design 3.Ribbon 4. ...

  2. Winform 中tabcontrol 美化

    需要对tabcontrol按照美工出的图进行美化 对tabpage页进行标题设置,首先对整个tabcontrol的DrawMode设置为OwnerDrawFixed,由于需要对标题宽度有要求,设置si ...

  3. WPF TabControl美化

    <Window.Resources> <!-- TabItem的样式 --> <Style TargetType="{x:Type TabItem}" ...

  4. Winfrom UI 美化 MetroModernUI库应用实例

    使用方式: 选择项目==>右键==>管理NuGet安装包==>输入Metro==> ==>添加选项卡(自定义命名,例如Metrol UI)==>浏览 ==>加 ...

  5. C# winform 界面美化技巧(扁平化设计)

    关于C#界面美化的一些小技巧 在不使用第三方控件如 IrisSkin 的前提下,依然可以对winform做出让人眼前一亮的美化 首先,我们先来实现主界面的扁平化 此处分为两个步骤,第一步是更改winf ...

  6. WPF自定义TabControl样式

    WPF自定义TabControl,TabControl美化 XAML代码: <TabControl x:Class="SunCreate.Common.Controls.TabCont ...

  7. Winform 美化

    首先,我们先来实现主界面的扁平化 此处分为两个步骤,第一步是更改winform自带的MainForm窗体属性,第二步是添加窗体事件. 将主窗体FormBorderStyle更改为None,这样就得到了 ...

  8. 使用Blend设计出符合效果的WPF界面

    之前不会用blend,感觉好难的,但美工给出的效果自己有没办法实现,所以研究了一下blend,感觉没有想象中的那么难 废话不多说,开始界面设计 今天拿到美工给的一个界面效果图 这个界面说实话,还可以吧 ...

  9. TabControl控件的美化

    文件下载:http://files.cnblogs.com/zfanlong1314/TabControlEX.rar 本文转载:http://www.cnblogs.com/lmlblog/arch ...

随机推荐

  1. layoutSubviews在以下情况下会被调用

    1.init初始化不会触发layoutSubviews2.addSubview会触发layoutSubviews3.设置view的Frame会触发layoutSubviews,当然前提是frame的值 ...

  2. mysql访问慢解决

    配置变更思路: 扩大MySQL连接数至2000,同时扩大操作系统最大文件描述符:扩大innodb缓存池 操作步骤: vi /etc/my.cnf max_connections = 2000innod ...

  3. [转]MySQL 中 You can't specify target table '表名' for update in FROM clause错误解决办法

    原文链接:https://blog.csdn.net/qq_29672495/article/details/72668008

  4. 在HTML5 中使用 kindeditor 的方法

    1.打开:http://kindeditor.net/ke4/examples/default.html 2.查看源代码,另存为 3.打开http://kindeditor.net/demo.php, ...

  5. C#中异步编程异常的处理方式

    异步编程异常处理 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try-catch来捕捉异常,未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.但是对于异步编程来说,异常处理一直 ...

  6. bootstrap-table删除指定行注意事项

    方法有两种: 1.使用官方文档的数据(反正我试了2个小时都不行,如有大神请指导下):使用events和operate相结合的方式 2.不使用events,在formatter里面定义事件的实现. 上面 ...

  7. 解决:Could not resolve bean definition resource pattern [/WEB-INF/classes/spring/applicationContext-*.xml]

    问题: 用Maven搭建spring.springmvc.mybatis时,运行报错: org.springframework.beans.factory.BeanDefinitionStoreExc ...

  8. QT QcustomPlot的使用(二)

    在QcustomPlot中,给横纵坐标添加箭头的方法 //在末尾添加箭头 customPlot->xAxis->setUpperEnding(QCPLineEnding::esSpikeA ...

  9. python — 池

    1. 池 池分为:进程池.线程池 池:预先的开启固定个数的进程数/线程数,当任务来临的时候,直接提交给已经开好的进程 / 线程,让这个进程 / 线程去执行就可以了. 池节省了进程.线程的开启.关闭.切 ...

  10. 玩linux笔记——持续更新

    说在最前面 centos 是基于redhat linux,所以最好的教程在红帽官网 https://access.redhat.com/documentation/en-us/red_hat_ente ...