渐变背景标签自定义控件






4.19/5 (15投票s)
2006年12月7日
4分钟阅读

107928

2976
本文介绍了一种创建具有渐变背景的标签式自定义控件的快速简便方法。
引言
本文介绍了一种创建具有渐变背景的标签式自定义控件的快速简便方法。在此示例中,标准 Windows Forms Tab
控件被扩展以提供持久的渐变背景;这与使用直接在控件的每个标签页的图形上下文中创建渐变背景的方法不同。即使背景是持久的,它也会在每次调整大小时或重绘时动态更新。图 1 说明了该控件的使用情况。
图 1. 正在使用的渐变标签控件
相比之下,动态地为每个标签页的图形上下文添加渐变可能会导致不太理想的结果。在图 2 中,渐变是动态添加到标签控件中每个标签页的图形上下文中的。标签页上的控件实际上已将其背景颜色设置为透明,但正如您在图中看到的,组面板和标签控件后面的区域显示为白色。当然,您可以在每个控件的背景上绘制渐变,但很难使控件上的渐变与背景上的渐变匹配,并且由于图案的不匹配,它仍然看起来不太好。无论如何,有一个更简单的解决方案。
图 2. 添加了渐变的标准标签控件
入门
要开始,请启动 Visual Studio 2005 IDE 并打开包含的项目。该解决方案包含一个 WinForms 项目,其中包含一个窗体和一个自定义控件。该窗体用作自定义控件的测试平台,而自定义控件是标准 Windows Forms Tab
控件的扩展。图 3 显示了该项目的解决方案资源管理器。
图 3. 解决方案资源管理器
代码:主窗体
应用程序的主窗体不包含任何有意义的代码;窗体本身包含一个 GradientTab
控件的实例,并且 GradientTab
控件通过属性编辑器配置,用于控件测试。
由于主窗体很简单,我将在本文档中不再对其进行详细描述。
代码:GradientTab 控件
GradientTab
控件是一个自定义控件,用于扩展标准 Windows Forms Tab
控件;对标准控件的唯一添加是运行时在每个标签页后面渲染渐变背景所需的那些。
如果您打开代码并检查导入,您会注意到在命名空间和类声明之前有以下导入。
using System;m;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;
namespace GradientTabControl
{
public partial class GradientTab :
System.Windows.Forms.TabControl
{
正如您在提供的代码中看到的,添加到类中默认导入的内容很少。添加了 System.Drawing.Drawing2D
引用,这是支持此类中某些活动的必需项。
在类声明之后,代码创建了两个成员变量,用于存储渐变的开始和结束颜色。在声明这两个变量之后,就处理自定义控件的初始化和绘制事件处理程序。
// member variables
System.Drawing.Color StartColor;
System.Drawing.Color EndColor;
public GradientTab()
{
InitializeComponent();
RepaintControls();
}
protected override void OnPaint(PaintEventArgs pe)
{
// TODO: Add custom paint code here
// Calling the base class OnPaint
//base.OnPaint(pe);
RepaintControls();
}
接下来描述在类构造函数和 Paint
事件中调用的 RepaintControls
方法。
private void RepaintControls())
{
foreach (TabPage ctl in this.TabPages)
{
System.Drawing.Drawing2D.LinearGradientBrush gradBrush;
gradBrush = new System.Drawing.Drawing2D.LinearGradientBrush(new
Point(0, 0),
new Point(ctl.Width, ctl.Height), PageStartColor, PageEndColor);
Bitmap bmp = new Bitmap(ctl.Width, ctl.Height);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(gradBrush, new Rectangle(0, 0, ctl.Width,
ctl.Height));
ctl.BackgroundImage = bmp;
ctl.BackgroundImageLayout = ImageLayout.Stretch;
}
}
在此方法中,检查标签控件中的每个页面,创建一个线性渐变笔刷并配置它以匹配标签页的区域;将开始和结束颜色(作为属性存在)传递给笔刷的新实例以定义渐变。
然后创建一个位图,并将其大小调整为标签页的高度和宽度。捕获位图的图形,然后调用 FillRectangle
方法在该位图的绘制表面上绘制渐变。一旦创建了位图,标签页的背景图像就设置为指向该位图,并将背景图像布局设置为 Stretch
模式。
由于我们将标签页的背景图像设置为动态生成的图像,因此渐变背景和放置在其上的控件不会遇到如果直接在标签页上绘制渐变可能会观察到的相同问题。
控件中的下一段代码用于响应重置大小的调用 RepaintControls
方法。
private void GradientTab_Resize(object sender, EventArgs e)
{
RepaintControls();
}
之后,设置用于设置渐变开始和结束颜色的属性。
public System.Drawing.Color PageStartColor
{
get
{
return StartColor;
}
set
{
StartColor = value;
RepaintControls();
}
}
public System.Drawing.Color PageEndColor
{
get
{
return EndColor;
}
set
{
EndColor = value;
RepaintControls();
}
}
在设计时,控件用户可以在属性网格中设置这些属性,或者可以在代码中设置这些值。
图 4. 开始和结束颜色的属性
摘要
本文介绍了一种基于标签控件的自定义控件,可实现持久的渐变背景。示例中提供的控件可以直接放入其他项目中并按原样使用。该控件的目的是提供一种工具,可以在标签控件中创建渐变标签页,而无需依赖直接在标签页的图形上下文中绘制渐变。