自定义标题背景的TabControl(转贴)

标准控件里面的TabControl是不能定义标题栏背景色的,在专业软件开发中,使用标准控件显然是不够的,但是很多开发者习惯了使用现成控件或者是别人做好的控件,一提到要用GDI绘制控件就觉得麻烦。但是在.NET中,GDI+很好的封装了原来使用不是很方便的GDI绘图方法,似的现在用C#绘制专业效果的控件变得非常容易。希望这篇介绍能起到抛砖引玉的效果。

自定义的TabControl使用时的效果。标题栏背景和标题背景都可以用两种颜色渐变效果,选中的标题字体和未选中的字体可以分别自定义。

增加的属性分布控制渐变的开始颜色和结束颜色,渐变的角度,以及两种字体和字体颜色。

要自定义TabContrl中的绘制,首先要把DrawMode属相设置为OwnerDrawFixed

接下来就是处理绘制的事件,DrawItem了

先定义要用到的变量:

 

            Graphics g = e.Graphics;
            Rectangle endPageRect = GetTabRect(TabPages.Count - 1); //最后一个标题栏的范围
            Rectangle TitleRect = GetTabRect(e.Index);              //当前标题栏的范围
            Rectangle HeaderBackRect = Rectangle.Empty;             //背景区域

 

            switch (Alignment)
            {
                case TabAlignment.Top:
                    HeaderBackRect = new Rectangle(new Point(endPageRect.X + endPageRect.Width, endPageRect.Y),
                        new Size(Width - endPageRect.X - endPageRect.Width, endPageRect.Height));
                    break;
                case TabAlignment.Bottom:
                    HeaderBackRect = new Rectangle(new Point(endPageRect.X + endPageRect.Width, endPageRect.Y),
                        new Size(Width - endPageRect.X - endPageRect.Width, endPageRect.Height));
                    break;
                case TabAlignment.Left:
                    HeaderBackRect = new Rectangle(new Point(endPageRect.X, endPageRect.Y + endPageRect.Height),
                        new Size(endPageRect.Width, Height - endPageRect.Y - endPageRect.Height));
                    break;
                case TabAlignment.Right:
                    HeaderBackRect = new Rectangle(new Point(endPageRect.X, endPageRect.Y + endPageRect.Height),
                        new Size(endPageRect.Width, Height - endPageRect.Y - endPageRect.Height));
                    break;
            }

 

            Brush TitleBackBrush = new LinearGradientBrush(
                TitleRect,                  //渐变区域
                titlebackcolor1,            //渐变开始颜色
                titlebackcolor2,            //渐变结束颜色
                titlebackangle);            //渐变角度

 

            Font font = headerfont;
            StringFormat sf = new StringFormat();
            sf.Alignment = titlealignment;
            sf.LineAlignment = StringAlignment.Center;
            Color fontcolor = headerfontcolor;

 

C#的图形绘制工作是由Graphics类来完成的,但是这个类不能直接用new来创建,需要从绘制事件的参数或者调用要绘制的对象的CreateGraphic方法来得到。这里就直接使用的DrawItem事件的参数DrawItemEventArgs中的Graphics成员。

定义了几个Rectangle变量,是为了下面的绘制区域做准备。

由于TabControl可能由于Alignment属相定义不同,得到的背景区域的矩形也不同,所以要分别来定义HeaderBackRect 的区域。

Brush TitleBackBrush 是用于填充标题背景的背景色定义。这里是采用的渐变色:LinearGradientBrush来定义的。

font 是定义用于绘制标题文字的字体。

好了,下面可以开始绘制了

 

            if (SelectedIndex == e.Index)    //如果绘制的标题就是选中的标题,则使用选中标题的字体,同时更新font和fontcolor
            {
                g.DrawRectangle(new Pen(TabPages[e.Index].BackColor), TitleRect);    //消除选中标题的矩形方框
                font = focusedheaderfont;
                fontcolor = focusedheaderfontcolor;
            }

 

            Brush fontbrush = new SolidBrush(fontcolor);

 

            //绘制标题文本
            g.DrawString(TabPages[e.Index].Text, font, fontbrush, TitleRect, sf);

 

            //绘制背景
            if (HeaderBackRect != Rectangle.Empty)
            {
                Brush HeaderBackBrush = new LinearGradientBrush(
                    HeaderBackRect,
                    HeaderBackColor1,
                    HeaderBackColor2,
                    headerbackangle);

 

                g.FillRectangle(HeaderBackBrush, HeaderBackRect);
            }

 

最后来看下效果

 

你可能感兴趣的:(技术文章,.NET(C#),alignment,gdi+,图形,.net,c#,工作)