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

时间:2011-08-22 23:44:35

标签: windows fonts gdi

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

2 个答案:

答案 0 :(得分:15)

  

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

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

  

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

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

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

除了:

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

答案 1 :(得分:1)

  

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

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

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