Windows Form中的TabControl重绘

Windows Form中的TabControl重绘

http://blog.canself.com/tag/tabcontrol%E9%87%8D%E7%BB%98/

最近整理自己工作以来的旧项目,将其中的一些技术点整理出来。这个tabcontrol重绘相关的项目是自己毕业不久就做的一个,针对这个项目后面还有wpf版,暂且不提,暂时先看这个。

下面是软件的主界面,当然这个重绘的还不够完全,针对tabcontrol边框的处理还不好。

ckqyjcfx_winform

可以看出,也有一定效果的。眨眼

下面说说步骤,看看代码:

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)
2 {
3     Graphics g = e.Graphics;
4  
5     TabPage changedpage = tabc_draw.TabPages[e.Index];//当前处理标签
6     Rectangle backrect = tabc_draw.GetTabRect(e.Index);//标签背景区域
7     Brush backbrush;//标签背景色
8     Brush fontbrush;//标签字体颜色
9     Font tabFont;//标签字体
10     Pen borderpen;//边框颜色
11  
12     //TabControl绘制
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();
16  
17     if (e.State == DrawItemState.Selected)
18     {
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);
23     }
24     else
25     {
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);
30     }
31     //绘制标签背景
32     g.FillRectangle(backbrush, backrect);
33  
34     //绘制标签字体
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));
39     //绘制非标签原始名称【可依据e.State修改】 g.DrawString("呵呵", tabFont, fontbrush, backrect, new StringFormat(_StringFlags));
40  
41     //绘制标签边框
42     //backrect.Offset(1, 1);
43     //backrect.Inflate(2, 2);
44     g.DrawRectangle(borderpen, backrect);
45  
46     backbrush.Dispose();
47     tabFont.Dispose();
48     fontbrush.Dispose();
49     borderpen.Dispose();
50 }

注释都在代码里了,就不详述了。下面是最后的效果的【只是简单的实现,自己多写写,模仿下就可以写出好效果啦】

tabcontroldrawitem

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值