來自於微軟.Net技術的C++托管擴展所包含的GDI+技術功能十分強大,本文將介紹如何使用GDI+的畫刷來繪制文本。
一、使用畫刷繪制文本的基本技術
本文所帶的例子程序允許用戶定義所要顯示的文本、字體尺寸、顯示文本所用的畫刷(網格畫刷或漸變畫刷)以及繪制文本的顏色等。例子代碼下載:GDIPlusTextWithBrushes.zip
下面是GDI+中使用漸變畫刷或網格畫刷繪制文本的基本步驟:
1、 在控件的繪制(Paint)事件中添加一個事件處理函數。
在這個處理函數中進行繪制文本的相關處理,這樣控件才能正確地進行重繪。
2、 獲取一個圖形(Graphics)對象。
正如我們所熟悉的設備上下文一樣,圖形對象是NET封裝的一個繪制平面,例如,當在一個PictureBox控件上進行繪制時,可以調用PictureBox::CreateGraphics方法來獲取一個Graphics對象,並在控件上繪圖時使用這個圖形(Graphics)對象。互聯網上有很多例子都是這麼做的,但是,有一個問題是,這樣得到的Graphics對象不是永久對象,如果用戶從當前程序轉到另一個應用程序並再次返回時,這個控件將無法正確地進行重繪。所以 ,要得當圖形對象應當使用傳遞給控件Paint方法的PaintEventArgs對象中的Graphics對象,代碼如下所示:
private: System::Void picText_Paint(System::Object * sender,
System::Windows::Forms::PaintEventArgs * e)
{
...
Graphics* g = e->Graphics;
3、實例化一個字體對象
在字體類的13個構造函數中,最基本的一個構造函數只需要你提供字體名及字體的大小。在下面的例子中,創建了一個20點,"Times New Roman"類的常規字體:
using namespace System::Drawing;
...
Font* font = new Font(S"Times new Roman", 20, FontStyle::Regular);
4、測量將被繪制的文本尺寸
為了繪制文本需要使用Graphics::MeasureString方法來測量文本尺寸。可以使用Graphics::MeasureString方法來完成這個任務。這個方法需要提供被測量的文本及字體對象,並返回SizeF結構對象,這個結構包含了將要進行繪制文本的尺寸。
SizeF textSize = g->MeasureString(S"My Sample Text", font);
5、實例畫刷對象
可以使用各種各樣的畫刷進行繪制文本,包括網格畫刷、線性漸變畫刷、路徑漸變畫刷、實體畫刷及紋理畫刷等,只是在創建各個不同的實例畫刷時傳遞的參數有一些小小的不同而已。對各種畫刷進行探討不是本文的內容,在本文的實例中只使用兩種畫刷(網格畫刷及線性漸變畫刷)。
// HatchBrush example
Brush* brush = new HatchBrush(HatchStyle::Cross,
Color::Black, Color::Blue);
// LinearGradIEntBrush example
RectangleF* rect = __nogc new RectangleF(PointF(0, 0), textSize);
brush= new LinearGradIEntBrush(*rect, Color::Black, Color::Blue,
LinearGradIEntMode::ForwardDiagonal);
6、(選項)填充背景
為了使應用程序有特色,可以在繪制文本前對背景進行顏色填充,這有兩個標准的方法。較簡單的方法是調用Graphics::Clear方法並定義將使用的顏色;但是有時需要更高級的控制,這時候需要使用Graphics::FillRectange方法。
Graphics::FillRectange方法允許開發人員規定所選擇的畫刷對象並定義確切的矩形坐標位置。關於畫刷對象,可以使用實例化的自定義畫刷或者是系統畫刷SystemBrushes,系統畫刷定義了若干屬性成員,它們是實心畫刷,各自用來表現窗口的不同的元素,包括激活的邊框及標題條等。
// Use the Windows-defined color for controls
// and explicitly state the rectangle coordinates
g->FillRectangle(SystemBrushes::Control, picText->Left, picText->Top,
picText->Right - picText->Left, picText->Bottom - picText->Top);
// Color the entire drawing surface using White
g->Clear(Color::White);
7、繪制文本
一旦將所有的GDI+對象實例化後,下面所需要做的事就是調用Graphics::DrawString方法。下面的例子使用了這個方法,在這個方法裡規定了需要顯示的文本、畫刷和字體及顯示文本的位置。
// Center the text on the drawing surface
g->DrawString(txtToDisplay->Text, font, brush,
(picText->Width - textSize.Width) / 2,
(picText->Height - textSize.Height) / 2);