现在,我们已经创建了一个不规则的窗体,并实现 了一些基本的移动窗体、关闭窗体的功能。然而,窗体上的按钮控件 还是老一套,那么方方正正,使得整个界面不美观。接下来我就向大 家介绍如何创建自定义形状的控件。
前面我 们创建不规则窗体的时候用到了TransparencyKey属 性,但是控件是没有该属性的,所以我们得找其他的方法来实现控件 的不规则形状了。在窗体上画一个自定义形状的控件时,你需要精确 的告知窗体在什么位置以及如何画该控件。在.Net Frame work中有相应的类和方法来帮你实现这些,所以你不必担心具体 实现。
.Net Framework中的 类提供给控件一个指示说明,该指示说明能确定控件被画的形状。通 过不同的指示说明,你就可以按你想要的方法来画控件了。该指示说 明利用了GraphicsPath这个类,这个类代表了一系列用 来画图的直线和曲线。首先,你得指定一个GraphicsPat h类的对象并告知它你要画什么图形。然后,你将控件的Regio n属性设置为上述GraphicsPath类的对象。这样,你就 可以创建任何自定义形状的控件了。
步骤如 下:
●创建一个GraphicsPath 类的实例对象。
●指定好该对象的各项细节 (如大小、形状等等)。
●将控件的Reg ion属性设置为上面建立的GraphicsPath类的实例对 象。
创建一个像文本的按钮控件:
1.拖放一个按钮控件到窗体上。
2.在属性对话框中进行如下设置:
●将Name属性设置为CustomButton。
●将BackColor属性设置为一个和窗体背景颜色 不同的颜色值。
●将其Text属性设置为 空字符串。
3.添加窗体的Paint事件 的事件处理函数。
< br> 4.添加以下代码,用G raphicsPath类的实例对象来画控件。下面的代码以一串 字符串的形式画该按钮控件,同时,程序还设置了字符串的字体、大 小、风格等属性。字符串被赋给GraphicsPath类的实例 对象。然后,该实例对象就被设置为按钮控件的Region属性。 这样一个自定义形状的控件就完成了。
private void CustomButton_Paint(object sen der,
System.Windows.Forms. PaintEventArgs e)
{
/ /初始化一个GraphicsPath类的对象
S ystem.Drawing.Drawing2D.Graphi csPath myGraphicsPath = new < br>System.Drawing.Drawing2D.Gr aphicsPath();
//确定一个字符串, 该字符串就是控件的形状
string strin gText = &
quot;
Click Me!&am p;
quot;
;
//确定字符串的字体
FontFamily family = new Font Family(&
quot;
Arial&
quo t;
);
//确定字符串的风格
in t fontStyle = (int)FontStyle.B old;
//确定字符串的高度
in t emSize = 35;
//确定字符串的起 始位置,它是从控件开始计算而非窗体
PointF origin = new PointF(0, 0);
//一个StringFormat对象来确定字符串的字 间距以及对齐方式
StringFormat fo rmat = new StringFormat(String Format.GenericDefault);
//用AddString方法创建字符串
myGr aphicsPath.AddString(stringTex t, family, fontStyle, emSize, origin, format);
//将控件的R egion属性设置为上面创建的GraphicsPath对象< br> CustomButton.Region = ne w Region(myGraphicsPath);
}
5. 创建按钮的Click事件的事件处理函数。添加该处 理函数来改变控件的背景颜色,从而证实控件原来的那些功能没有被 削减。
private void CustomB utton_Click(object sender, Sys tem.EventArgs e)
{
Cu stomButton.BackColor = Color.B lanchedAlmond;
}
6.保存工程并运 行。
进 一步优化效果
以上我们运用了Graph icsPath类的实例对象来创建了自定义形状的一个按钮控件。 不过我们用的是文本字符串形式的一个形状,是否可以用三角形或是 圆形等形状呢?答案是肯定的。.Net Framework能为 我们提供一些预先定义好了的形状以供我们在程序中使用。通过运用 这些,你可以创造出几乎任意形状的控件,你还可以把它们结合起来 使用以发挥更大的功能。
下面的实例就运用了四个椭 圆,当它们被运用到控件上后,看起来就像人的眼睛,很有意思吧。
private void button1_Pa int(object sender,
System. Windows.Forms.PaintEventArgs e )
{
System.Drawing.Dr awing2D.GraphicsPath myGraphic sPath = new
System.Drawing .Drawing2D.GraphicsPath();
myGraphicsPath.AddEllipse(n ew Rectangle(0, 0, 125, 125));
myGraphicsPath.AddEllip se(new Rectangle(75, 75, 20, 2 0));
myGraphicsPath.AddE llipse(new Rectangle(120, 0, 1 25, 125));
myGraphicsPat h.AddEllipse(new Rectangle(145 , 75, 20, 20));
//改变按钮的背 景颜色使之能被容易辨认
button1.Back Color = Color.Chartreuse;
button1.Size = new System.Dr awing.Size(256, 256);
bu tton1.Region = new Region(myGr aphicsPath);
}
< br>
最后,你还得 搞清楚窗体类是从System.Windows.Forms.C ontrol类继承而来的。也就是说,由窗体设计器提供给你的窗 体最终还是一个控件。因此,你能用位图文件创建一个不规则的窗体 ,你还能用GraphicsPath类对象来像创建自定义形状的 控件那样创建不规则的窗体。有兴趣的读者不妨用此方法一试效果。