3.2.9 處理像素點
令人驚奇的是,處理窗體中的單個像素非常需要技巧,因為Graphics對象沒有提供對像素點進行讀取或設(shè)置的機制。您可能會認為通過畫一條起點坐標與終點坐標相同的線段就可以實現(xiàn)。但是,由于GDI在處理繪制單像素點請求時的奇怪行為,在這種情況下根本不會繪制任何東西,同樣的情況也會發(fā)生在寬度和高度都為0的矩形與橢圓上,以及所有點坐標都相同的多邊形上。
能夠?qū)崿F(xiàn)繪制單像素點的方法是使用FillRectangle方法,將其width參數(shù)與height參數(shù)都設(shè)置為1,這樣會在指定的位置上繪制一個只包含了一個像素的矩形。然而,這種方式的效率非常低,應(yīng)盡量避免使用。
在本章的后文中我們將看到Bitmap類,它提供了更有用的GetPixel與SetPixel方法,它們可以很直接地對單個像素點進行獲取和設(shè)置。
3.2.10 顯示文本
我們還可以使用DrawString方法在窗體上繪制文本。該方法提供了一些重載,允許更好地對文本的呈現(xiàn)進行控制。
所有這些重載的前3個參數(shù)都是相同的:用于顯示的文本字符串、字體、用于繪制文本的筆刷。
DrawString方法最簡單的版本需要指定文本的顯示位置,即,使用(x,y)坐標。程序清單3-5展示了在坐標(10,10)上,用窗體默認的字體顯示了一些紅色的文本。
程序清單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ù)中的坐標應(yīng)是文本打印區(qū)域左上角的坐標。如果文本的寬度超過了屏幕,超出屏幕右邊界的部分就不會顯示。我們可以在文本的任意位置上插入換行符(使用C#中的\n字符序列),將程序清單3-5中要打印的文本修改為"Hello\nworld!",這樣,Hello就會出現(xiàn)在world!的上方。換行符會使文本在下方重新打印一行,但還是以DrawString方法所指定的x坐標為起點。
如果需要更好地控制文本的布局,那么可以利用該方法提供的一些其他重載??梢蕴峁┮粋€Rectangle對象,令文本繪制在該矩形區(qū)域中。下面的代碼在坐標(10,10)上創(chuàng)建了一個寬和高都為100的矩形。最終結(jié)果是文本被換行后才能放置在這個定義好的區(qū)域中。GDI會自動在距離最近的完整單詞的后面進行斷行,所以您不必擔心在單詞中會發(fā)生換行(查看程序清單3-6),如果文本太長,已經(jīng)達到了矩形的底端,那么多出來的文本將會被剪裁掉。
程序清單3-6 在矩形區(qū)域中進行換行測試
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));
}
}
這段代碼的運行結(jié)果如圖3-7所示。注意,右邊的文本已經(jīng)超出了宿主它的矩形的范圍,所以看不到底部的文本。
我們還可以通過StringFormat對象進一步提供一個參數(shù),來控制在矩形中如何顯示文本。該對象有兩個標志:
● NoClip 如果指定NoClip,那么文本可以顯示在定義好的矩形邊框之外。在矩形區(qū)域中,文本還是換行的,但超出預(yù)定義區(qū)域高度的部分還是連續(xù)的。
● NoWrap 此標志禁止文本在矩形中換行。任何位于矩形區(qū)域之外的文本都會被剪裁掉。
這兩個標志可以通過C#中的二進制OR操作符(使用符號“|”)來一同使用。不過,它的結(jié)果相當于只為DrawString函數(shù)指定了一個坐標點,而沒有指定一個矩形區(qū)域。
注:以上內(nèi)容圖略,圖片內(nèi)容請參考原圖書