【问题标题】:How can I find what font was actually used for my CreateFont call?如何找到我的 CreateFont 调用实际使用的字体?
【发布时间】:2011-11-01 13:29:44
【问题描述】:

在 Windows 中,如果请求的字体未被请求,CreateFontIndirect() 调用可以静默替换兼容字体。 GetObject() 调用不反映这种替换;它返回相同的LOGFONT 传入。我怎样才能找到实际创建的字体?或者,如何强制 Windows 只返回请求的确切字体?

【问题讨论】:

  • 这种控制需要使用Uniscribe API。
  • @Hans,不幸的是,这在一些相当多毛的遗留代码的中间。重构它以使用 Uniscribe 将是一项……艰巨的任务,缺乏测试和文档至少没有帮助。如果有一些无证 GDI 调用从 HFONT 获取此类信息,那总比没有好:)

标签: windows fonts gdi


【解决方案1】:

要在不同语言版本的操作系统上获得适当的字体, 调用 EnumFontFamiliesEx 并在 LOGFONT 结构,然后检索适当的字体名称和 使用 CreateFont 或 CreateFontIndirect 创建字体。

虽然这不是从 HFONT 获取实际字体名称的通用方法,但您可以事先检查 CreateFontIndirect 将(最有可能)返回的内容。

从 MSDN 建议这是从属性中获取字体系列的良好解决方案来看,这似乎是 Windows 内部执行替换的方式。

【讨论】:

  • 我怀疑问题实际上与字体替换有关,因为选择了目标输出设备上可用的字体,而不是针对各种语言/脚本问题的字体链接或字体回退。
  • @Adrian McCarthy,我猜评论的第一部分具有误导性。重要的部分是 EnumFontFamiliesEx 可用于枚举符合 LOGFONT 中给出的标准的字体。像任何其他成员一样适用于 lfCharSet。
  • EnumFontFamiliesEx 仅查看 LOGFONT 中的某些字段。实际的字体映射器会查看所有内容。确定选择哪种字体的唯一方法是将其选择到 DC 中并进行查询。
【解决方案2】:

在 Windows 中,如果未请求所请求的字体,则 CreateFontIndirect() 调用可以静默替换兼容字体。 GetObject() 调用不反映这种替换;它返回相同的 LOGFONT 传入。

进行替换的不是 CreateFontIndirect。当字体被选入 DC 时会发生替换。 CreateFontIndirect 只是为您提供 LOGFONT 的内部副本的句柄。这就是为什么 GetObject 会返回相同的 LOGFONT。

我如何才能找到实际创建的字体?

如果您将 HFONT 选择到目标 DC,您可以向 DC 询问有关实际选择为与 LOGFONT 最佳匹配的字体的信息。

这基本上告诉您实际创建了什么字体。

旁白:

在进行打印预览之类的操作时,可以从 LOGFONT 开始,将其选择到打印机 DC(或 IC)中,获取实际字体的详细信息(打印机通常会替换字体),然后创建一个新的 LOGFONT代表实际字体。将其选择到屏幕 DC 中,并通过适当的尺寸转换 - 与用户实际获得的内容非常匹配。

【讨论】:

  • 值得注意的是,GetTextFace 不一定返回相同的名称,即使选择的字体符合要求。例如,如果您将MS Gothic 传递给CreateFont,则GetTextFace 可能会返回MS ゴシックMS Gothic,具体取决于区域设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2013-01-02
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
相关资源
最近更新 更多