正文

GDI圖形編程(4)

Windows移動游戲開發(fā)實戰(zhàn) 作者:(美)Adam Dawes


 

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);

}

}


上一章目錄下一章

Copyright ? 讀書網(wǎng) m.ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號