首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ GDI+ 字體與文字繪製完整指南

     編輯:關於VC++

字體屬性核心概念

字體是文字呈現的視覺形式,涵蓋字型、風格、尺寸等屬性。靈活運用不同字體能大幅提升文字表現力,例如以粗體突顯關鍵字句。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 font(&fontFamily, 12, FontStyleRegular, UnitPoint);

參數依序為:字體家族指標、尺寸、風格、單位。為相容 GDI,另提供 Font(HDC hdc, const LOGFONTW* logfont) 建構式。

文字輸出:DrawString 詳解

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 類別

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);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved