字體是文字呈現的視覺形式,涵蓋字型、風格、尺寸等屬性。靈活運用不同字體能大幅提升文字表現力,例如以粗體突顯關鍵字句。GDI+ 透過 FontFamily、FontStyle 與尺寸單位提供完整字體控制。
字體家族定義字符的書寫模式。中文常見有微軟正黑體、新細明體、標楷體等。GDI+ 使用 FontFamily 類別:
FontFamily fontFamily(L"微軟正黑體"); // 定義字體家族
風格控制粗細、傾斜、底線、刪除線等。預定義風格包括:
FontStyleRegular - 正常FontStyleBold - 粗體FontStyleItalic - 斜體FontStyleBoldItalic - 粗斜體FontStyleUnderline - 底線FontStyleStrikeout - 刪除線尺寸以字符高度表示,支援多種單位:
UnitPoint - 點 (1/72 英吋)UnitPixel - 像素UnitInch - 英吋UnitMillimeter - 公釐UnitDisplay - 1/75 英吋UnitDocument - 1/300 英吋中文常用「號數」表示,初號最大,八號最小。
透過 Font 類別建構函式創建字體:
Font font(&fontFamily, 12, FontStyleRegular, UnitPoint);
參數依序為:字體家族指標、尺寸、風格、單位。為相容 GDI,另提供 Font(HDC hdc, const LOGFONTW* 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 - 版面矩形區域origin - 起始座標stringFormat - 格式化屬性brush - 畫刷 (支援純色、塗鴉、材質、漸層)
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);
透過 SetTextRenderingHint 控制輸出品質:

Graphics graphics(pDC->m_hDC);
FontFamily fontFamily(L"標楷體");
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);
主要渲染模式:
TextRenderingHintSingleBitPerPixel - 無反鋸齒TextRenderingHintSingleBitPerPixelGridFit - 網格對齊無反鋸齒TextRenderingHintAntiAliasGridFit - 反鋸齒+網格對齒 (品質最佳)StringFormat 控制對齊、讀取方向、換行等屬性。
Status SetAlignment(StringAlignment align);
Status SetLineAlignment(StringAlignment align);
align 可為:
StringAlignmentNear - 靠左/靠右 (視書寫方向)StringAlignmentCenter - 置中StringAlignmentFar - 兩端對齊Status SetFormatFlags(INT flags);
常用旗標:
StringFormatFlagsDirectionRightToLeft - 從右向左StringFormatFlagsDirectionVertical - 垂直排版StringFormatFlagsNoFitBlackBox - 允許字符超出版面Graphics graphics(pDC->m_hDC);
SolidBrush solidBrush(Color::Blue);
FontFamily fontFamily(L"標楷體");
Font font(&fontFamily, 16, FontStyleRegular, UnitPoint);
StringFormat stringFormat;
stringFormat.SetFormatFlags(StringFormatFlagsDirectionRightToLeft |
StringFormatFlagsDirectionVertical |
StringFormatFlagsNoFitBlackBox);
stringFormat.SetAlignment(StringAlignmentCenter);
WCHAR string[] = L"這些文字是垂直置中且從右向左閱讀順序...";
graphics.DrawString(string, (INT)wcslen(string), &font,
RectF(30, 30, 150, 200), &stringFormat, &solidBrush);