最近整理自己工作以来的旧项目,将其中的一些技术点整理出来。这个tabcontrol重绘相关的项目是自己毕业不久就做的一个,针对这个项目后面还有wpf版,暂且不提,暂时先看这个。
下面是软件的主界面,当然这个重绘的还不够完全,针对tabcontrol边框的处理还不好。
可以看出,也有一定效果的。
下面说说步骤,看看代码:
1、首先就是设置tabcontrol的drawmode属性,使其重绘有效。
1 | this .tabc_draw.DrawMode = TabDrawMode.OwnerDrawFixed; |
2、写tabcontrol的drawitem事件。
Graphics g = e.Graphics;
TabPage changedpage = tabc_draw.TabPages[e.Index];//当前处理标签
Rectangle backrect = tabc_draw.GetTabRect(e.Index);//标签背景区域
Brush backbrush;//标签背景色
Brush fontbrush;//标签字体颜色
Font tabFont;//标签字体
Pen borderpen;//边框颜色
//TabControl绘制
Brush backtabcontrol = new SolidBrush(Color.Transparent);
g.FillRectangle(backtabcontrol, this.tabc_draw.ClientRectangle.X + 100, this.tabc_draw.ClientRectangle.Y, this.tabc_draw.ClientRectangle.Size.Width, this.tabc_draw.ItemSize.Height);
backtabcontrol.Dispose();
if (e.State == DrawItemState.Selected)
{
backbrush = new SolidBrush(Color.White);
fontbrush = new SolidBrush(Color.Blue);
tabFont = new Font("宋体", 14, (FontStyle.Bold|FontStyle.Italic), GraphicsUnit.Pixel);
borderpen = new Pen(Color.LightBlue);
}
else
{
backbrush = new SolidBrush(Color.WhiteSmoke);
fontbrush = new SolidBrush(Color.Black);
tabFont = new Font("宋体", 12, FontStyle.Regular, GraphicsUnit.Pixel);
borderpen = new Pen(Color.DarkGreen);
}
//绘制标签背景
g.FillRectangle(backbrush, backrect);
//绘制标签字体
StringFormat _StringFlags = new StringFormat();
_StringFlags.Alignment = StringAlignment.Center;
_StringFlags.LineAlignment = StringAlignment.Center;
g.DrawString(changedpage.Text, tabFont, fontbrush, backrect, new StringFormat(_StringFlags));
//绘制非标签原始名称【可依据e.State修改】 g.DrawString("呵呵", tabFont, fontbrush, backrect, new StringFormat(_StringFlags));
//绘制标签边框
//backrect.Offset(1, 1);
//backrect.Inflate(2, 2);
//g.DrawRectangle(borderpen, backrect);
backbrush.Dispose();
tabFont.Dispose();
fontbrush.Dispose();
borderpen.Dispose();
1 | void tabc_draw_DrawItem( object sender, DrawItemEventArgs e) |
3 | Graphics g = e.Graphics; |
5 | TabPage changedpage = tabc_draw.TabPages[e.Index]; |
6 | Rectangle backrect = tabc_draw.GetTabRect(e.Index); |
13 | Brush backtabcontrol = new SolidBrush(Color.Black); |
14 | g.FillRectangle(backtabcontrol, this .tabc_draw.ClientRectangle.X + 100, this .tabc_draw.ClientRectangle.Y, this .tabc_draw.ClientRectangle.Size.Width, this .tabc_draw.ItemSize.Height); |
15 | backtabcontrol.Dispose(); |
17 | if (e.State == DrawItemState.Selected) |
19 | backbrush = new SolidBrush(Color.Black); |
20 | fontbrush = new SolidBrush(Color.Yellow); |
21 | tabFont = new Font( "宋体" , 15, FontStyle.Bold, GraphicsUnit.Pixel); |
22 | borderpen = new Pen(Color.LightBlue); |
26 | backbrush = new SolidBrush(Color.White); |
27 | fontbrush = new SolidBrush(Color.Red); |
28 | tabFont = new Font( "楷体" , 15, FontStyle.Bold, GraphicsUnit.Pixel); |
29 | borderpen = new Pen(Color.DarkGreen); |
32 | g.FillRectangle(backbrush, backrect); |
35 | StringFormat _StringFlags = new StringFormat(); |
36 | _StringFlags.Alignment = StringAlignment.Center; |
37 | _StringFlags.LineAlignment = StringAlignment.Center; |
38 | g.DrawString(changedpage.Text, tabFont, fontbrush, backrect, new StringFormat(_StringFlags)); |
44 | g.DrawRectangle(borderpen, backrect); |
注释都在代码里了,就不详述了。下面是最后的效果的【只是简单的实现,自己多写写,模仿下就可以写出好效果啦】