在Windows中,如果未请求所请求的字体,CreateFontIndirect()
调用可以静默替换兼容字体。 GetObject()
电话不反映这种替代;它返回相同的LOGFONT
传入。如何找到实际创建的字体?或者,如何强制Windows仅返回所请求的确切字体?
答案 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内部执行替换的方式。