标准控件里面的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);
}
最后来看下效果