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

bdo*_*lan 14 windows fonts gdi

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

Adr*_*thy 15

在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`,具体取决于区域设置。 (2认同)