程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC++ GDI+編程的字體和文本繪制

VC++ GDI+編程的字體和文本繪制

編輯:關於VC++

字體是文字顯示和打印的外觀形式,它包括了文字的字樣、風格和尺寸等多方面的屬性。適當地選用不同的字體,可以大大地豐富文字的外在表現力。例如,把文字中某些重要的字句用較粗的字體顯示,能夠體現出突出、強調的意圖。當然,文本輸出時還可使用其格式化屬性和顯示質量來優化文本顯示的效果。

字體屬性和字體創建

字體的屬性有很多,這裡主要介紹字樣、風格和尺寸三個主要屬性。

字樣是字符書寫和顯示時表現出的特定模式,例如,對於漢字,通常有宋體、楷體、仿宋、黑體、隸書以及幼圓等多種字樣。GDI+是通過FontFamily類來定義字樣的,例如下面的代碼:

程序代碼:

FontFamily fontFamily(L"幼圓"); // 定義"幼圓"字樣

字體風格主要表現為字體的粗細和是否傾斜等特點。GDI+為用戶提供了一些預定義的字體風格:FontStyleRegular(正常)、FontStyleBold(加粗)、FontStyleItalic(斜體)、FontStyleBoldItalic (粗斜體)、FontStyleUnderline(下劃線)和FontStyleStrikeout(刪除線)。

字體尺寸是用來指定字符所占區域的大小,通常用字符高度來描述。字體尺寸可以取毫米或英寸作為單位,但為了直觀起見,也常常采用一種稱為點的單位,一點約折合為1/72英寸。對於漢字,還常用號數來表示字體尺寸,初號字最大,以下依次為小初、一號、小一、二號、小二??,如此類推,字體尺寸起來越小。GDI+為用戶提供了UnitDisplay(1/75英寸)、UnitPixel(像素)、UnitPoint(點)、UnitInch(英寸)、UnitDocument(1/300英寸)、UnitMillimeter(毫米)等字體尺寸單位。

使用GDI+中的Font類,可以直接通過構造函數創建一個字體對象,例如下列代碼:

程序代碼:

Font font(&fontFamily, 12, FontStyleRegular, UnitPoint);

構造函數的第一個參數是用來指定FontFamily類對象指針,第二參數是用來指定字體的尺寸,它的實際大小取決於第四個參數所指定的尺寸單位。第三個參數用來指定字體風格。

為了與原來的GDI字體相兼容,Font的構造函數還有另外一種型式:

程序代碼:

Font( HDC hdc, const LOGFONTW* logfont)

其中,hdc是用來指定一個窗口的設備環境句柄,logfon是指向LOGFONT(邏輯字體)數據結構的指針。

文本輸出

文本的最終輸出不僅依賴於文本的字體,而且還跟文本的顏色、對齊方式、字符間隔等有很大關系。GDI+只有一個輸出文本的函數DrawString,它的原型如下:
程序代碼:

DrawString( const WCHAR* string, INT length, const Font* font,
const RectF& layoutRect, const StringFormat* stringFormat,
const Brush* brush );

DrawString( const WCHAR* string, INT length, const Font* font,
const PointF& origin, const Brush* brush );

DrawString( const WCHAR* string, INT length, const Font* font,
const PointF& origin, const StringFormat* stringFormat,
const Brush* brush);

其中,string用來指定要輸出的字符串,length表示該字符串的長度,font用來指定字體,layoutRect用來指定一個字符串所輸出的矩形區域,stringFormat用來指定文本輸出格式化屬性,origin用來指定字符串輸出的起點。需要注意的是,PointF和RectF類與Point和Rect類基本相同,所不同的是數據類型是浮點而後者是INT型。brush用來指定一個畫刷,這個畫刷既可以是SolidBrush和HatchBrush,也可以是TextureBrush(紋理畫刷),甚至是漸變畫刷。例如下面的代碼,結果如圖7.14所示。

程序代碼:

Graphics graphics( pDC->m_hDC );

FontFamily fontFamily(L"幼圓");
Font font(&fontFamily, 20, FontStyleRegular, UnitPoint);
PointF pointF(30, 10);
Image image(L"image.jpg");
TextureBrush tBrush(&image);

LinearGradientBrush linGrBrush(
Point(30, 50),
Point(100, 50),
Color(255, 255, 0, 0),
Color(255, 0, 0, 255));

WCHAR string[256];
wcscpy(string, L"歡迎使用GDI+!");

graphics.DrawString(string, (INT)wcslen(string), &font, pointF, &tBrush);
pointF.Y += 50;
graphics.DrawString(string, (INT)wcslen(string), &font, pointF,
&linGrBrush);

需要說明的是,在GDI+中,我們可以通過SetTextRenderingHint來控制文本輸出的質量。例如下面的代碼,其結果如圖7.15所示。

程序代碼:

Graphics graphics( pDC->m_hDC );

FontFamily fontFamily(L"楷體_GB2312");
Font font(&fontFamily, 30, FontStyleRegular, UnitPixel);
SolidBrush solidBrush(Color(255, 0, 0, 255));
WCHAR string1[] = L"沒有任何優化處理";
WCHAR string2[] = L"字體優化,但邊不作平滑處理";
WCHAR string3[] = L"消除走樣,且邊作平滑處理";

graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel);
graphics.DrawString(
string1, (INT)wcslen(string1), &font, PointF(10, 10), &solidBrush);

graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixelGridFit);
graphics.DrawString(
string2, (INT)wcslen(string2), &font, PointF(10, 50), &solidBrush);

graphics.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);
graphics.DrawString(
string3, (INT)wcslen(string3), &font, PointF(10, 90), &solidBrush);

文本格式化屬性

文本的格式屬性通常包括對齊方式、字符間隔以及文本調整等。GDI+提供StringFormat類來控制這些格式屬性,通常我們調用以下幾個函數來進行相關屬性設置。

程序代碼:

Status SetAlignment( StringAlignment align);
Status SetLineAlignment( StringAlignment align);

該函數用來設置文本對齊方式,align可以是StringAlignmentNear(左對齊或右對齊,取決於書寫方向是從左到右還是從右到左)、StringAlignmentCenter(居中)或StringAlignmentFar(兩端對齊)。

程序代碼:

Status SetFormatFlags( INT flags );

該函數用來設置文本格式化標志,flags可以是StringFormatFlagsDirectionRightToLeft(水平閱讀方向是從右向左)和StringFormatFlagsDirectionVertical(垂直文本)等值。例如下面的代碼,其結果如圖7.16所示。

程序代碼:

Graphics graphics( pDC->m_hDC );
SolidBrush solidBrush(Color::Blue);
FontFamily fontFamily(L"楷體_GB2312");
Font font(&fontFamily, 16, FontStyleRegular, UnitPoint);

StringFormat stringFormat;
stringFormat.SetFormatFlags( StringFormatFlagsDirectionRightToLeft |
StringFormatFlagsDirectionVertical |
StringFormatFlagsNoFitBlackBox);
stringFormat.SetAlignment(StringAlignmentCenter);
WCHAR string[] = L"這些文字是垂直居中且是從右到左的閱讀次序, 它們是通過 \
SetFormatFlags和SetAlignment來設置的!";

graphics.DrawString( string, (INT)wcslen(string), &font,
RectF(30, 30, 150, 200), &stringFormat, &solidBrush);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved