| 屬性 | 類型 | 說明 | 關鍵細節 |
| Name | string | 字體族名 | 系統必須安裝,否則回退預設字體 |
| Size | Integer | 點數 (1/72 英吋) | 正值,與 Height 互動 |
| Height | Integer | 像素高度 | 負值=含行距,正值=僅字形;優先級高於 Size |
| Color | TColor | 前景色 | 文字顏色,不影響背景 |
| Style | TFontStyles | 樣式集合 | [fsBold, fsItalic, fsUnderline, fsStrikeOut] |
| Charset | TFontCharset | 字符集 | 影響字形選擇,DEFAULT_CHARSET=1 自動匹配 |
| Orientation | Integer | 旋轉角度 (1/10 度) | 逆時針,450=45°,僅支援 TrueType/OpenType |
| Pitch | TFontPitch | 字距類型 | fpDefault/fpVariable/fpFixed,效果視字體而定 |
基礎文字繪製範例
procedure TForm1.FormPaint(Sender: TObject);
const
S = '萬一的 Delphi 博客';
begin
// 方式 1:直接操作 Canvas.Font (推薦,無需手動管理生命週期)
Canvas.Font.Name := '微軟雅黑';
Canvas.Font.Style := [fsBold, fsItalic];
Canvas.Font.Color := clRed;
Canvas.Font.Height := 72; // 像素高度
Canvas.TextOut(10, 10, S);
// 方式 2:建立 TFont 實例指派 (需手動 Free)
// var Font := TFont.Create;
// try ... Canvas.Font := Font; finally Font.Free; end;
end;
Size 與 Height 的換算關係
// 螢幕 DPI = 96 時
Font.Size := 12; // Font.Height ≈ -16 (含內部行距)
Font.Height := -16; // Font.Size ≈ 12
Font.Height := 16; // 實際字形高度 16px,無額外行距
// 公式 (邏輯單位)
Height = -MulDiv(Size, Screen.PixelsPerInch, 72);
// 反向
Size = -MulDiv(Height, 72, Screen.PixelsPerInch);
Charset 字符集完整對照表
| 常數 | 值 | 適用語系 |
| ANSI_CHARSET | 0 | ANSI (西歐) |
| DEFAULT_CHARSET | 1 | 系統預設 (推薦,自動匹配) |
| SYMBOL_CHARSET | 2 | 符號字體 (Wingdings 等) |
| SHIFTJIS_CHARSET | 128 | 日文 |
| HANGEUL_CHARSET | 129 | 韓文 |
| GB2312_CHARSET | 134 | 簡體中文 |
| CHINESEBIG5_CHARSET | 136 | 繁體中文 |
| OEM_CHARSET | 255 | OEM 代碼頁 |
| JOHAB_CHARSET | 130 | 舊韓文 |
| HEBREW_CHARSET | 177 | 希伯來文 |
| ARABIC_CHARSET | 178 | 阿拉伯文 |
| GREEK_CHARSET | 161 | 希臘文 |
| TURKISH_CHARSET | 162 | 土耳其文 |
| VIETNAMESE_CHARSET | 163 | 越南文 |
| THAI_CHARSET | 222 | 泰文 |
| EASTEUROPE_CHARSET | 238 | 東歐 |
| RUSSIAN_CHARSET | 204 | 俄文 |
Orientation 文字旋轉實戰
const
S = '萬一的 Delphi 博客';
begin
Canvas.Font.Style := [fsBold];
Canvas.Font.Color := clRed;
Canvas.Font.Height := 32;
Canvas.Font.Orientation := 450; // 45 度 (單位: 1/10 度)
Canvas.TextOut(0, ClientHeight - 20, S);
// 注意:旋轉基準點在 TextOut 的 (X,Y),文字向左上旋轉
end;
Style 集合操作技巧
// 添加樣式
Canvas.Font.Style := Canvas.Font.Style + [fsBold, fsUnderline];
// 移除樣式
Canvas.Font.Style := Canvas.Font.Style - [fsItalic];
// 切換樣式
if fsBold in Canvas.Font.Style then
Canvas.Font.Style := Canvas.Font.Style - [fsBold]
else
Canvas.Font.Style := Canvas.Font.Style + [fsBold];
// 檢測樣式
if [fsBold, fsItalic] * Canvas.Font.Style = [fsBold, fsItalic] then
// 同時包含粗體和斜體
高 DPI 環境下的字體縮放
// 邏輯像素 → 物理像素
function LogicalToPhysicalFontSize(const LogicalSize: Integer): Integer;
begin
Result := MulDiv(LogicalSize, Screen.PixelsPerInch, 96);
end;
// 在 FormCreate 或 DPI 變更事件中調用
Canvas.Font.Height := -LogicalToPhysicalFontSize(12); // 12pt 邏輯大小
常見陷阱與避坑
- Height 負值含行距:
TextHeight 返回含行距高度,多行排版需額外加行間距
- 字體未安裝靜默回退:無異常,但視覺不符預期,部署時確保字體授權與安裝
- Orientation 僅支援 TrueType/OpenType:點陣字體、舊版字體旋轉無效
- Charset 不匹配導致亂碼/方塊:中文環境建議用 DEFAULT_CHARSET 或明確 GB2312/BIG5
- Canvas.Font 指派會複製屬性:
Canvas.Font := FontObj 是賦值非引用,後續修改 FontObj 不影響 Canvas
字體度量輔助函數
function GetFontMetrics(ACanvas: TCanvas; const Font: TFont): TTextMetric;
var
TM: TTextMetric;
begin
ACanvas.Font := Font;
GetTextMetrics(ACanvas.Handle, TM);
Result := TM;
// TM.tmHeight, TM.tmAscent, TM.tmDescent, TM.tmInternalLeading, TM.tmExternalLeading
// TM.tmAveCharWidth, TM.tmMaxCharWidth, TM.tmOverhang
end;
精通 TFont 七大屬性的協作關係,配合 Canvas.TextOut/TextRect/TextExtent,能實現從簡單標籤到複雜排版引擎的各類文字繪製需求。
- 上一篇文章: Delphi TPen 畫筆屬性全解析:Color、Width、Style、Mode 完整指南
- 下一篇文章: Delphi Canvas.TextRect 完整指南:兩種重載、格式化選項與對齊技巧
Copyright ©
程式碼之家 All Rights Reserved