Windows Form中的TabControl重绘

转载 2016年06月01日 11:12:09

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

C#重绘TabControl的Tabpage标签,添加图片及关闭按钮

http://blog.csdn.net/gui597651737/article/details/8067385

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

TabControl 标签重绘

抄袭师姐的代码,实现标签选择颜色变化,给标签添加关闭标示。无法实现鼠标移到标签上发生明显变化。    public MainForm()         {             this.t...
  • aerkate
  • aerkate
  • 2012年02月15日 17:18
  • 5557

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

VC中的闪烁&重绘

如果一个程序出现闪烁现象,会让人觉得程序编写人员很马虎,缺乏对细节的足够重视。Windows程序的任何部分都没有任何理由出现闪烁现象。这篇文章的目的是告诉读者如何使用相关的技术防止窗口出现闪烁效果。&...

MFC——仿TabCtrl实现多页显示

在MFC中有自带的TabCtrl可以实现多页,但是那个标签放在上面,不太美观,并且字体格式也比较固定,当然这个标签头是可以重绘的。...

MFC TabCtrl空间

MFC可以使用TabCtrl空间实现类似于选项卡功能的实现。 实现方法大概有这几步组成: 1、工程与主对话框创建     新建一个基于对话框的MFC应用程序,添加一个TabCtrl控件,并绑定C...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

自定义TabControl

之前想做一个TabControl,给它加上关闭。但是找了一些,基本上没有现成的。最后参考了几份源码,现在封装成直接可以用的。源码如下: using System; using System.Col...

tabControl控件自定义样式

tabControl控件自定义样式 原文: http://topic.csdn.net/u/20081110/14/3b61faf8-ece1-469a-8da5-2b7c515f040d.html ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows Form中的TabControl重绘
举报原因:
原因补充:

(最多只允许输入30个字)