如何判断字体是否为符号字体?

5

给定一个HFONT,我该如何判断它是否为符号字体?我正在使用的pdf库需要以不同的方式处理符号字体,因此我需要一种编程方法来判断任何给定的字体是否为符号字体。

2个回答

5
使用 GetObject 函数将字体属性保存到 LOGFONT 结构中。检查 lfCharSet 成员,如果它是 SYMBOL_CHARSET,则表示这是一个符号字体。

天啊!我刚刚在http://msdn.microsoft.com/en-us/library/dd145037%28v=VS.85%29.aspx阅读LOGFONT页面,你比我更快地回答了... - Adriano Varoli Piazza
这在实践中可能是正确的,但在理论上可能会失败。 GetObject返回用于指定字体的LOGFONT的副本。 但是,字体映射器可能已替换不同的字体。 尽管似乎极不可能将符号字体替换为文本字体(反之亦然),但在理论上可能发生。 因此,最好检查由GetTextMetrics返回的TEXTMETRIC中的tmCharSet字段,因为它应该代表实际字体而不是逻辑字体。 - Adrian McCarthy
@AdrianMcCarthy 我认为 GetObject 返回的是实际选择的字体的 LOGFONT,而不是最初请求的字体;除非你有一个证实链接,否则进行验证可能是值得的。如果您认为 GetTextMetrics 更好,欢迎提供另一个答案。 - Mark Ransom
@Mark Ranson:字体映射发生在HFONT被选入DC时,因为它取决于设备的具体情况。由于GetObject仅使用HFONT,并且没有关于其已选择或将要选择的DC的任何信息,因此它只能返回原始LOGFONT而无法返回其他信息。 https://dev59.com/9Ww05IYBdhLWcg3wmCso#7193439 - Adrian McCarthy
@AdrianMcCarthy,看起来我过去已经看到并点赞了那个链接,但是感谢你提醒我,因为很显然我已经忘记了那个有用的信息。你现在应该留下你自己的答案。 - Mark Ransom

1

Mark Ransom的答案在99.999%的情况下都是可行的,但理论上可能会给出错误的答案。

为了避免这种可能性,您应该使用GetTextMetrics来获取实际字体的TEXTMETRICS,并检查tmCharSet是否为SYMBOL_CHARSET

检查lfCharSettmCharSet之间有什么区别?

当您创建一个HFONT时,Windows会对LOGFONT进行内部复制。它描述了您想要的字体,这可能与您获得的字体不同。

当您将HFONT选择到设备(或信息)上下文中时,字体映射器会找到最符合与该HFONT关联的LOGFONT的实际字体。然而,最佳匹配可能不是完全匹配的。因此,当您需要查找实际字体的某些信息时,应小心查询HDC而不是HFONT

如果您使用 GetObject 查询 HFONT,您只会得到原始的 LOGFONT。因为 GetObject 不知道字体映射器选择(或将选择)哪种实际字体,所以它不能告诉您有关实际字体的任何信息。
GetTextMetricsGetTextFace 等询问特定 DC 中所选字体的 API,将为您提供有关实际字体的信息。
对于这个问题,Mark 的答案(使用 GetObject)可能总是有效的,因为字体映射器在您需要文本字体时选择符号字体(反之亦然)的几率很小。不过,一般来说,当您想了解有关实际字体的信息时,请找到一种询问 HDC 的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接