CreateTextFormat的文档没有说明字体回退选择,但如果选择了默认(NULL = 系统)集合,那么 DirectWrite 显然实现了字体回退。例如,如果我将在 Gabriola 字体中找不到的两个字形添加到 DirectWrite SDK 演示应用程序使用的测试字符串中,那么 DirectWrite 会从 Segoe UI Symbol 字体中挑选缺少的字形。这发生在基本DrawText
调用和自定义渲染器(对字体回退没有自定义),如下所示(唯一的修改是测试字符串):
复选标记和白星来自 Segoe UI Symbol,而不是来自 Gabriola,即使在演示应用程序中只指定了 Gabriola。那么,有谁知道 DirectWrite(CreateTextFormat)如何选择后备字体?
更新。我看到有一个GetSystemFontFallback可以列出备用字体,但它仅在 Windows 8.1 中可用(因为它在 IDWriteFactory2 中)。我猜他们已经注意到 API 在枚举后备字体方面的差距。所以我猜在 Windows 8.1 之前没有办法做到这一点,但如果有人知道黑客/解决方法......
更新2。引用MSFT 员工的话:
DirectWrite 具有未从注册表读取或以任何方式可配置的后备数据。不过,在 Windows 8.1 中,引入了 API,允许应用指定自己的回退。(它类似于用于创建复合字体定义的 WPF API。)
这仍然不能准确解释硬编码算法/替换方案实际上是什么。