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

Delphi 繪圖進階:Canvas.TextExtent 精確測量文字寬高實戰

     編輯:Delphi

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 深度解析


// 典型關係 (螢幕 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 返回未旋轉的邊界框
// 旋轉後實際佔用區域需用三角函數計算

常見陷阱與避坑

  1. TextHeight 返回固定值:同一 Font 下,'A' 和 'g' 高度相同 (含下延部預留)
  2. Canvas 未設 Font 時:繼承自控件/表單預設字體,度量可能不符預期
  3. 高 DPI 下:Font.Size 自動縮放,Font.Height 需手動處理
  4. TextExtent 不含行距:多行排版需自行加行間距

掌握 TextExtent 配合 Font.Height/Size 的靈活度量,能實現精確的文字排版、自適應 UI 與高質量列印輸出。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
屬性單位正負語義適用場景
Font.Size點 (1/72 英吋)正值邏輯字體大小、跨裝置一致性
Font.Height像素負值 = 含內部行距 / 正值 = 僅字體高度精確像素控制、列表項高度匹配