【问题标题】:What makes Windows choose a certain font rather than another when the target font is not available当目标字体不可用时,是什么让 Windows 选择某种字体而不是另一种字体
【发布时间】:2013-05-27 13:13:22
【问题描述】:

当目标字体不可用时,是什么让 Windows 选择某种字体而不是另一种?

我正在使用以下代码来创建某种字体。

somefont.CreateFont(-11, 0, 0, 0, FW_NORMAL, 0, 0, 0,
                            DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
                            CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                            DEFAULT_PITCH|FF_SWISS, "Segoe UI");

现在,如果 Segoe UI 不可用(如在 Windows XP 上),字体映射器会自动选择“Arial”作为后备。 这实际上是我想要的,但是是什么让 Windows XP 选择“Arial”而不是其他一些无衬线字体,例如“Microsoft Sans Serif”。​​

【问题讨论】:

  • 字体回退很复杂,取决于注册表项。并且取决于地区,例如东亚国家的规则是不同的。太多了,无法插入,也许 superuser.com 上的某个人愿意试一试。
  • 我建议你看看 Wine 的字体映射器,因为它是开源的,而且他们在逆向工程 Windows 的内部工作方面付出了很多努力,所以他们的字体映射器可能非常接近于真正的字体映射器有效。

标签: winapi fonts mfc


【解决方案1】:

关于字体映射器内部工作原理的在线信息似乎很少。如果this very old article仍然适用,那么

每次不匹配 [in font attributes] 都会受到惩罚,并且惩罚是累积的。映射器跟踪罚分最低的物理字体...

在两种不同字体具有完全相同的惩罚的情况下,检查的第一个字体就是选择的字体。应用程序无法控制此顺序。

从那里我猜,如果“Segoe UI”不存在,您永远无法确定选择了哪种FF_SWISS 字体。安装名称以“aa”开头的瑞士字体以查看检查顺序是否大致按字母顺序排列会很有启发性。

(@Hans Passant: 据我了解,字体回退仅在您已经在设备上下文中选择了一种字体然后尝试渲染一些字体不包含字形的字符时才会发生。参见例如Font Linking vs. Font Fallback by迈克尔·卡普兰。)

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 2013-03-21
    • 2015-08-26
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2011-03-31
    • 2012-04-28
    • 2010-10-02
    相关资源
    最近更新 更多