Windows 如何找到CreateFont调用实际使用的字体?

Windows 如何找到CreateFont调用实际使用的字体?,windows,fonts,gdi,Windows,Fonts,Gdi,在Windows中,如果请求的字体未被请求,则调用可以以静默方式替换兼容字体。调用不反映这种替换;它返回传入的相同的LOGFONT。如何找到实际创建的字体?或者,如何强制Windows仅返回所需的确切字体 要在不同语言版本的操作系统上获得适当的字体, 在中使用所需的字体特征调用EnumFontFamiliesEx LOGFONT结构,然后检索适当的字体名称和 使用CreateFont或CreateFontIndirect创建字体 虽然这不是从HFONT获取实际字体名称的通用方法,但您可以事先检查

在Windows中,如果请求的字体未被请求,则调用可以以静默方式替换兼容字体。调用不反映这种替换;它返回传入的相同的
LOGFONT
。如何找到实际创建的字体?或者,如何强制Windows仅返回所需的确切字体

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

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

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

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

做替换的不是你。在DC中选择字体时,会发生替换。CreateFontIndirect只提供LOGFONT的内部副本的句柄。这就是GetObject返回相同LOGFONT的原因

如何找到实际创建的字体

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

  • 面名称可用于
  • 您可以使用获取度量
  • 如果所选字体为TrueType或OpenType,则可以使用获取其他指标
这基本上告诉您实际创建的字体

旁白:


在执行打印预览之类的操作时,您可以从LOGFONT开始,将其选择到打印机DC(或IC)中,获取实际字体的详细信息(打印机通常替换字体),然后创建更能代表实际字体的新LOGFONT。选择它到屏幕DC,并用适当的大小转换——与用户实际得到的匹配很好。

你需要使用unsiCReAPI API来控制这种类型。@ HANS,不幸的是,这在一些相当繁琐的遗留代码的中间是很深的。重构它以使用Uniscribe将是一个。。。困难的任务,没有测试和文档的帮助。如果有一些未记录的GDI调用从HFONT获取此类信息,这总比什么都没有好:)我怀疑问题实际上是关于字体替换,因为目标输出设备上选择了可用的字体,而不是字体链接或各种语言/脚本问题的字体回退。@Adrian McCarthy,我猜评论的第一部分有误导性。重要的一点是,EnumFontFamiliesEx可用于枚举符合LOGFONT中给定条件的字体。与任何其他成员一样应用于lfCharSet。EnumFontFamiliesEx只查看LOGFONT中的某些字段。实际的字体映射器会查看所有内容。要确定选择了哪种字体,唯一的方法是将其选择到DC中并进行查询。值得注意的是,
GetTextFace
不一定返回相同的名称,即使所选字体符合要求。例如,如果将
MS-Gothic
传递给
CreateFont
GetTextFace
可能返回
MS ゴシック
MS
取决于区域设置。