【问题标题】:Load exact font win32加载精确字体 win32
【发布时间】:2020-08-26 15:27:40
【问题描述】:

如何强制 Win32 GDI 字体映射器仅加载字体名称完全匹配的字体?我正在加载特定的字体,没有可行的替代品。任何替换都是不正确的。我希望 CreateFont 或 CreateFontIndirect 实际上失败。或者,也许是其他提供更多控制的 Win32 界面。即使我从文件中加载字体资源,它仍然会尝试替换。而且,似乎没有办法从资源中获取字体名称。

【问题讨论】:

  • 我不知道是否有任何方法可以控制 GDI 的字体映射器,尽管您可以通过首先使用 EnumFontFamiliesEx 查找特定字体来模拟所需的行为。
  • 我认为 GDI 中的设计假设是设备上下文中必须始终选择 some 字体。首先枚举并查找特定字体的建议是有道理的。您还可以使用GetFontData 检查实际选择到 DC 中的字体的“名称”表,以确认它是您想要的。
  • 到目前为止,使用 GetFontData 是最好的方法——但前提是我知道人脸名称。从字体文件加载字体资源不会给我这些信息。为了尝试强制 GDI 映射器只选择请求的字体,获得最佳 LOGFONT 选项也很重要。我创建了其中一种字体,但我无法准确预测它想要什么。例如,字符集选项。这与字体根本没有真正的关系。我猜默认的 ANSI_CHARSET 是最好的选择。所有这些字体都是 Unicode 字体,但没有匹配的字符集选项。

标签: winapi fonts


【解决方案1】:

首先,问题的一部分是我的,因为这是在过去某个时候转换为 64 位 Unicode 的旧 32 位 ANSI 代码。所以指定字体名称的例程只复制了一半的名称,但 nul-terminator 是正确的,留下一半的字体名称是垃圾。解决这个问题,对解决问题大有帮助。

其次,GetTextMetrics 函数对作为资源安装的字体不起作用,因此该函数不可用。此外,GetFontData 仅适用于 True Type 字体,因此也无法使用。所有感兴趣的字体都是 Unicode,但并非所有字体都是 True Type。但是,GetTextFace 函数确实有效。此外,即使从字体枚举返回扩展字体信息,设置完整的字体名称也是没有意义的,因为它实际上不在 LOGFONT 中。

在检查 LOGFONT 属性以确定最重要的属性后,我确定了面名、ANSI 字符集并将字体系列设置为不关心。重量、斜体、下划线和删除属性在必要时显然是捏造的。其余属性的默认值似乎是可以接受的,通常不需要。

加载字体后,我调用 GetTextFace 名称并将其与请求的字体进行比较。这似乎运作良好。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 2015-07-02
  • 2017-07-29
  • 1970-01-01
相关资源
最近更新 更多