3.2.4 畫筆與畫刷
所有的圖形操作都需要一個Pen對象(主要用于繪制線段)或者Brush對象(用于使用純色來填充窗體中的某個區(qū)域),這些對象應(yīng)當(dāng)在代碼中進(jìn)行創(chuàng)建,并且在使用完后進(jìn)行釋放。
1. 畫筆
要創(chuàng)建一個畫筆,只需要實例化一個新的System.Drawing.Pen對象,然后指定畫筆的顏色即可(我們已經(jīng)在第3.2.3節(jié)中討論過)。
除了指定畫筆顏色外,還可以指定它的寬度(單位為像素)。在默認(rèn)情況下,畫筆的寬度為一個像素。
畫筆創(chuàng)建完成以后,還可以通過其Color或Width屬性來進(jìn)行修改,不需要再新建一個新的Pen對象。
畫筆還可以繪制虛線,這是通過其DashStyle屬性來控制的。
在使用完一個Pen對象后,記得要調(diào)用Dispose方法將分配給它的資源釋放掉。
2. 畫刷
System.Drawing.Brush類與Pen類有所不同,它實際上是一個抽象基類。.NET Framework通過該基類提供了幾種不同類型的畫刷,在實際使用時,必須對這些派生的類型進(jìn)行實例化。
在.NET CF中有兩個這樣的畫刷類:SolidBrush與TextureBrush。最常用的是SolidBrush;通過向其構(gòu)造函數(shù)中傳遞一個Color參數(shù),它就會創(chuàng)建一個純色用于填充我們所繪制的區(qū)域的內(nèi)部。TextureBrush的構(gòu)造函數(shù)中要傳遞的不是Color參數(shù),而是一個Bitmap對象,它將以該位圖圖像的平鋪副本來填充圖形內(nèi)部(我們很快就會討論Bitmap對象)。
這兩個畫刷類都提供了用于對其外觀進(jìn)行修改的屬性(SolidBrush類中是Color屬性,TextureBrush類中是Image屬性)。同樣,在使用完畫刷對象后應(yīng)調(diào)用Dispose函數(shù)來釋放它們所占用的資源。
但是,.NET CF中所包含的畫刷派生類比桌面版.NET Framework中提供的要少。如果您對桌面版GDI的使用方法很熟悉,就會注意到.NET CF中沒有提供LinearGradientBrush類,這令人遺憾,因為它可以創(chuàng)建一些有用且很吸引人的填充區(qū)域。我們只好自己編寫代碼來模擬該類的效果了。
3.2.5 繪制線段
在窗體中可以呈現(xiàn)的所有圖形中,線段是最簡單的圖形結(jié)構(gòu)。一條線段應(yīng)該包含下面幾個屬性:
● 用于畫線段的Pen類
● 線段的起點坐標(biāo)
● 線段的終點坐標(biāo)
在繪制線段時,這些屬性都會以參數(shù)的方式傳遞給Graphics對象的DrawLine方法,如程序清單3-2所示,這段代碼發(fā)生在窗體的Paint事件中。
程序清單3-2 使用DrawLine方法
private void MyForm_Paint(object sender, PaintEventArgs e)
{
// Draw a line from point (10, 10) to point (40, 40)
using (Pen linePen = new Pen(Color.Black))
{
e.Graphics.DrawLine(linePen, 10, 10, 40, 40);
}
}
這段代碼在坐標(biāo)(10,10)到坐標(biāo)(40,40)之間繪制了一條黑色的線段,如圖3-3所示。注意,線段包含了這兩個端點;線段實際的高度和寬度都為31像素。這看上去似乎是個微不足道的小細(xì)節(jié),但如果要繪制很多需要鏈接在一起的線段,這個細(xì)節(jié)就會變得重要了。
DrawLines是DrawLine方法的一個延伸,可以一次性繪制一系列首尾鏈接的線段。您需要提供一個Point變量數(shù)組,DrawLines會依次在各相鄰點之間繪制一條連接在一起的線段。該方法不會將最后一個點與第一個點連接起來。所以,如果您想要繪制一個閉合的環(huán),就需要在數(shù)組的最后再次指定第一個點的坐標(biāo),或者使用下一節(jié)將要介紹的DrawPolygon方法。程序清單3-3演示了如何繪制折線,結(jié)果如圖3-4所示。
程序清單3-3 使用DrawLines方法
private void MyForm_Paint(object sender, PaintEventArgs e)
{
// Declare an array of points
Point[] points = { new Point(20, 20), new Point(50, 50),
new Point(80, 20), new Point(110, 50),
new Point(140, 20) , new Point(170, 50) };
using (Pen linePen = new Pen(Color.Black))
{
// Draw a series of lines between each defined point
e.Graphics.DrawLines(linePen, points);
}
}