在Windows中,如果请求的字体没有被请求, CreateFontIndirect()
调用可以默默地replace兼容的字体。 GetObject()
调用不会反映这个replace; 它返回相同的LOGFONT
传入。我怎样才能find什么字体实际上创build? 或者,我如何强制Windows只返回所需的确切字体?
在Windows中,如果请求的字体没有被请求,CreateFontIndirect()调用可以默默地替换兼容的字体。 GetObject()调用不会反映这个替换; 它返回传入的相同LOGFONT。
这不是CreateFontIndirect正在做替换。 字体被选入DC时发生替换。 CreateFontIndirect只是给你一个LOGFONT的内部拷贝的句柄。 这就是为什么GetObject为您提供相同的LOGFONT的原因。
我怎样才能找到真正创建的字体?
如果您将HFONT选择到目标DC中,则可以向DC请求关于实际选择的字体的信息作为LOGFONT的最佳匹配。
这基本上告诉你什么字体实际上创建。
在旁边:
当做类似打印预览的工作时,你可以从一个LOGFONT开始,将其选择到打印机DC(或IC)中,获取实际字体的细节(打印机常常替代字体),然后创建一个更具代表性的LOGFONT实际的字体。 选择到屏幕直流,并 – 适当的大小转换 – 做一个相当不错的用户将实际得到的匹配。
要在操作系统的不同语言版本上获得适当的字体,请在LOGFONT结构中调用具有所需字体特征的EnumFontFamiliesEx,然后检索相应的字体名称,并使用CreateFont或CreateFontIndirect创建字体。
虽然从HFONT获取实际字体名称并不是一种通用的方法,但您可以事先检查CreateFontIndirect(很可能)会返回什么。
从MSDN的建议来看,这是从属性获取字体系列的一个很好的解决方案,就像Windows内部执行替换一样。