You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi应用指定不存在字体时,Windows 10会选用哪种字体?如何获取实际字体名?

如何获取Windows自动替换的字体族名称?

在Delphi应用中执行代码 Font.Name:= 'Monotype';,但系统里并没有名为Monotype的字体(未在字体列表中显示),此时Windows会自动选用一款替代字体。我想知道系统实际使用的字体族名称是什么?

我这么做是因为Windows自动选的字体显示效果很好,但我更希望直接在应用里指定正确的字体族名称,而不是依赖系统的自动替换逻辑。

附字体对比:

  • 左:Segoe UI
  • 中:指定Monotype后显示的字体
  • 右:加粗的Microsoft Sans Serif

Segoe UI左,Monotype中,Microsoft Sans Serif右
字体细节对比

解决方案

要获取系统实际使用的字体名称,可以通过以下两种方式:

1. 直接读取TFont的Name属性

设置Font.Name为不存在的字体后,Windows完成自动替换时会更新该属性为实际使用的字体名称,直接读取即可:

Font.Name := 'Monotype';
ShowMessage('实际使用的字体:' + Font.Name);

2. 调用Windows API获取

通过GetTextFace函数从设备上下文(DC)中提取当前生效的字体名称,适合更底层的验证场景:

var
  FontName: array[0..LF_FACESIZE-1] of Char;
begin
  Font.Name := 'Monotype';
  GetTextFace(Canvas.Handle, LF_FACESIZE, FontName);
  ShowMessage('实际使用的字体:' + StrPas(FontName));
end;

补充说明

Windows的字体替换逻辑基于系统内置的字体映射表,通常会优先匹配与缺失字体风格接近的默认字体,但不同Windows版本可能存在差异。获取到实际字体名称后,直接在代码中指定该名称,就能保证所有用户端显示一致的效果。

内容的提问来源于stack exchange,提问作者Livius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:15:08