正文

GDI圖形編程(7)

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


 

3.2.9  處理像素點(diǎn)

令人驚奇的是,處理窗體中的單個(gè)像素非常需要技巧,因?yàn)镚raphics對(duì)象沒有提供對(duì)像素點(diǎn)進(jìn)行讀取或設(shè)置的機(jī)制。您可能會(huì)認(rèn)為通過畫一條起點(diǎn)坐標(biāo)與終點(diǎn)坐標(biāo)相同的線段就可以實(shí)現(xiàn)。但是,由于GDI在處理繪制單像素點(diǎn)請(qǐng)求時(shí)的奇怪行為,在這種情況下根本不會(huì)繪制任何東西,同樣的情況也會(huì)發(fā)生在寬度和高度都為0的矩形與橢圓上,以及所有點(diǎn)坐標(biāo)都相同的多邊形上。

能夠?qū)崿F(xiàn)繪制單像素點(diǎn)的方法是使用FillRectangle方法,將其width參數(shù)與height參數(shù)都設(shè)置為1,這樣會(huì)在指定的位置上繪制一個(gè)只包含了一個(gè)像素的矩形。然而,這種方式的效率非常低,應(yīng)盡量避免使用。

在本章的后文中我們將看到Bitmap類,它提供了更有用的GetPixel與SetPixel方法,它們可以很直接地對(duì)單個(gè)像素點(diǎn)進(jìn)行獲取和設(shè)置。

3.2.10  顯示文本

我們還可以使用DrawString方法在窗體上繪制文本。該方法提供了一些重載,允許更好地對(duì)文本的呈現(xiàn)進(jìn)行控制。

所有這些重載的前3個(gè)參數(shù)都是相同的:用于顯示的文本字符串、字體、用于繪制文本的筆刷。

DrawString方法最簡(jiǎn)單的版本需要指定文本的顯示位置,即,使用(x,y)坐標(biāo)。程序清單3-5展示了在坐標(biāo)(10,10)上,用窗體默認(rèn)的字體顯示了一些紅色的文本。

程序清單3-5  在屏幕上繪制文本

private void MyForm_Paint(object sender, PaintEventArgs e)

{

using (SolidBrush textBrush = new SolidBrush(Color.Red))

{

e.Graphics.DrawString("Hello world!", this.Font, textBrush, 10, 10);

}

}

我們提供的參數(shù)中的坐標(biāo)應(yīng)是文本打印區(qū)域左上角的坐標(biāo)。如果文本的寬度超過了屏幕,超出屏幕右邊界的部分就不會(huì)顯示。我們可以在文本的任意位置上插入換行符(使用C#中的\n字符序列),將程序清單3-5中要打印的文本修改為"Hello\nworld!",這樣,Hello就會(huì)出現(xiàn)在world!的上方。換行符會(huì)使文本在下方重新打印一行,但還是以DrawString方法所指定的x坐標(biāo)為起點(diǎn)。

如果需要更好地控制文本的布局,那么可以利用該方法提供的一些其他重載。可以提供一個(gè)Rectangle對(duì)象,令文本繪制在該矩形區(qū)域中。下面的代碼在坐標(biāo)(10,10)上創(chuàng)建了一個(gè)寬和高都為100的矩形。最終結(jié)果是文本被換行后才能放置在這個(gè)定義好的區(qū)域中。GDI會(huì)自動(dòng)在距離最近的完整單詞的后面進(jìn)行斷行,所以您不必?fù)?dān)心在單詞中會(huì)發(fā)生換行(查看程序清單3-6),如果文本太長(zhǎng),已經(jīng)達(dá)到了矩形的底端,那么多出來的文本將會(huì)被剪裁掉。

程序清單3-6  在矩形區(qū)域中進(jìn)行換行測(cè)試

private void MyForm_Paint(object sender, PaintEventArgs e)

{

using (SolidBrush textBrush = new SolidBrush(Color.Red))

{

// Print the text into a square

e.Graphics.DrawString("The quick brown fox jumps over the lazy dog",

this.Font, textBrush, new Rectangle(10, 10, 100, 100));

// Print the text into a rectangle with insufficient height

e.Graphics.DrawString("The quick brown fox jumps over the lazy dog",

this.Font, textBrush, new Rectangle(130, 10, 100, 35));

}

}

這段代碼的運(yùn)行結(jié)果如圖3-7所示。注意,右邊的文本已經(jīng)超出了宿主它的矩形的范圍,所以看不到底部的文本。

我們還可以通過StringFormat對(duì)象進(jìn)一步提供一個(gè)參數(shù),來控制在矩形中如何顯示文本。該對(duì)象有兩個(gè)標(biāo)志:

● NoClip  如果指定NoClip,那么文本可以顯示在定義好的矩形邊框之外。在矩形區(qū)域中,文本還是換行的,但超出預(yù)定義區(qū)域高度的部分還是連續(xù)的。

● NoWrap  此標(biāo)志禁止文本在矩形中換行。任何位于矩形區(qū)域之外的文本都會(huì)被剪裁掉。

這兩個(gè)標(biāo)志可以通過C#中的二進(jìn)制OR操作符(使用符號(hào)“|”)來一同使用。不過,它的結(jié)果相當(dāng)于只為DrawString函數(shù)指定了一個(gè)坐標(biāo)點(diǎn),而沒有指定一個(gè)矩形區(qū)域。

注:以上內(nèi)容圖略,圖片內(nèi)容請(qǐng)參考原圖書


上一章目錄下一章

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