Delphi应用指定不存在字体时,Windows 10会选用哪种字体?如何获取实际字体名?
如何获取Windows自动替换的字体族名称?
在Delphi应用中执行代码 Font.Name:= 'Monotype';,但系统里并没有名为Monotype的字体(未在字体列表中显示),此时Windows会自动选用一款替代字体。我想知道系统实际使用的字体族名称是什么?
我这么做是因为Windows自动选的字体显示效果很好,但我更希望直接在应用里指定正确的字体族名称,而不是依赖系统的自动替换逻辑。
附字体对比:
- 左: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
相关产品推荐
相关产品推荐

