Canvas.TextWidth/TextHeight vs TextExtent:文字度量最佳實踐
在 Delphi 繪圖中精確獲取文字寬高是排版、對齊、裁剪的基礎。Canvas.TextWidth/TextHeight 雖簡單,但 Canvas.TextExtent 返回 TSize 結構,一次調用同時獲得寬高,且能配合 Font.Height/Font.Size 靈活控制字體大小。
基礎度量函數對比
var
str: string;
w, h: Integer;
sz: TSize;
begin
str := '萬';
// 單獨獲取 (兩次調用)
w := Canvas.TextWidth(str); // 12
h := Canvas.TextHeight(str); // 13
// 一次獲取 (推薦)
sz := Canvas.TextExtent(str); // sz.cx=12, sz.cy=13
w := sz.cx;
h := sz.cy;
end;
等寬字體倍數關係驗證
str := '萬一'; // 兩個字元
w := Canvas.TextWidth(str); // 24 = 12 * 2
h := Canvas.TextHeight(str); // 13 (高度不變)
字體大小變更即時影響度量
// 修改 Font.Size (點數)
Canvas.Font.Size := 16;
sz := Canvas.TextExtent('萬一'); // 寬度: 42, 高度: 25
// 直接設定 Font.Height (像素,可負值含內部間距)
Canvas.Font.Height := 32;
sz := Canvas.TextExtent('萬一'); // 寬度: 52, 高度: 32
Font.Size vs Font.Height 深度解析
| 屬性 | 單位 | 正負語義 | 適用場景 |
| Font.Size | 點 (1/72 英吋) | 正值 | 邏輯字體大小、跨裝置一致性 |
| Font.Height | 像素 | 負值 = 含內部行距 / 正值 = 僅字體高度 | 精確像素控制、列表項高度匹配 |
// 典型關係 (螢幕 96 DPI)
Font.Size := 12; // Font.Height ≈ -16 (含行距)
Font.Height := -16; // Font.Size ≈ 12
Font.Height := 16; // 實際字體像素高度 16,無額外行距
實戰應用:自動換行文字排版
procedure DrawWrappedText(ACanvas: TCanvas; const Text: string; Rect: TRect);
var
Words: TArray<string>;
Line, Word: string;
LineHeight, SpaceWidth: Integer;
X, Y: Integer;
begin
LineHeight := ACanvas.TextHeight('Hg') + 2; // 行高含間距
SpaceWidth := ACanvas.TextWidth(' ');
X := Rect.Left;
Y := Rect.Top;
Words := Text.Split([' ']);
for Word in Words do
begin
if X + ACanvas.TextWidth(Word) > Rect.Right then
begin
Inc(Y, LineHeight);
X := Rect.Left;
end;
ACanvas.TextOut(X, Y, Word);
Inc(X, ACanvas.TextWidth(Word) + SpaceWidth);
end;
end;
進階:旋轉文字的度量
Canvas.Font.Orientation := 450; // 45 度 (單位: 1/10 度)
sz := Canvas.TextExtent('旋轉文字');
// 注意:TextExtent 返回未旋轉的邊界框
// 旋轉後實際佔用區域需用三角函數計算
常見陷阱與避坑
- TextHeight 返回固定值:同一 Font 下,'A' 和 'g' 高度相同 (含下延部預留)
- Canvas 未設 Font 時:繼承自控件/表單預設字體,度量可能不符預期
- 高 DPI 下:
Font.Size 自動縮放,Font.Height 需手動處理
- TextExtent 不含行距:多行排版需自行加行間距
掌握 TextExtent 配合 Font.Height/Size 的靈活度量,能實現精確的文字排版、自適應 UI 與高質量列印輸出。
- 上一篇文章: Delphi 字串類型全家族解析:string、AnsiString、WideString、ShortString、String[n]
- 下一篇文章: Delphi 圖像類體系詳解:TGraphic、TBitmap、TMetafile、TIcon、TPicture
Copyright ©
程式碼之家 All Rights Reserved