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

Delphi TFont 字體屬性完全指南:Name、Size、Color、Style、Charset、Orientation

     編輯:Delphi

TFont 七大核心屬性深度解析與文字繪製實戰

TFont 封裝了字體名稱、大小、顏色、樣式、字符集、旋轉角度等屬性,是 Canvas 文字輸出的核心配置。掌握它們的交互關係與陷阱,能實現專業級文字排版效果。

核心屬性速查表

基礎文字繪製範例


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 字符集完整對照表

屬性類型說明關鍵細節
Namestring字體族名系統必須安裝,否則回退預設字體
SizeInteger點數 (1/72 英吋)正值,與 Height 互動
HeightInteger像素高度負值=含行距,正值=僅字形;優先級高於 Size
ColorTColor前景色文字顏色,不影響背景
StyleTFontStyles樣式集合[fsBold, fsItalic, fsUnderline, fsStrikeOut]
CharsetTFontCharset字符集影響字形選擇,DEFAULT_CHARSET=1 自動匹配
OrientationInteger旋轉角度 (1/10 度)逆時針,450=45°,僅支援 TrueType/OpenType
PitchTFontPitch字距類型fpDefault/fpVariable/fpFixed,效果視字體而定

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 邏輯大小

常見陷阱與避坑

  1. Height 負值含行距:TextHeight 返回含行距高度,多行排版需額外加行間距
  2. 字體未安裝靜默回退:無異常,但視覺不符預期,部署時確保字體授權與安裝
  3. Orientation 僅支援 TrueType/OpenType:點陣字體、舊版字體旋轉無效
  4. Charset 不匹配導致亂碼/方塊:中文環境建議用 DEFAULT_CHARSET 或明確 GB2312/BIG5
  5. 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,能實現從簡單標籤到複雜排版引擎的各類文字繪製需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
常數值適用語系
ANSI_CHARSET0ANSI (西歐)
DEFAULT_CHARSET1系統預設 (推薦,自動匹配)
SYMBOL_CHARSET2符號字體 (Wingdings 等)
SHIFTJIS_CHARSET128日文
HANGEUL_CHARSET129韓文
GB2312_CHARSET134簡體中文
CHINESEBIG5_CHARSET136繁體中文
OEM_CHARSET255OEM 代碼頁
JOHAB_CHARSET130舊韓文
HEBREW_CHARSET177希伯來文
ARABIC_CHARSET178阿拉伯文
GREEK_CHARSET161希臘文
TURKISH_CHARSET162土耳其文
VIETNAMESE_CHARSET163越南文
THAI_CHARSET222泰文
EASTEUROPE_CHARSET238東歐
RUSSIAN_CHARSET204俄文