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

时间:2010-05-18 22:20:07

标签: winapi fonts

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

2 个答案:

答案 0 :(得分:5)

使用GetObject将字体的属性设置为LOGFONT结构。检查lfCharSet成员;如果它是SYMBOL_CHARSET,你有一个符号字体。

答案 1 :(得分:1)

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

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

检查lfCharSettmCharSet之间的区别是什么?

创建HFONT时,Windows会制作LOGFONT的内部副本。它描述了您想要的字体,它可能与您获得的字体不同。

当您在设备(或信息)上下文中选择HFONT时,字体映射器会找到与LOGFONT相关联的HFONT最匹配的实际字体。但是,最佳匹配可能不完全匹配。因此,当您需要找到有关实际字体的内容时,您应该注意查询HDC而不是HFONT

如果您使用HFONT查询GetObject,则只需返回原始LOGFONTGetObject并未告诉您有关实际字体的任何信息,因为它不知道字体映射器选择(或将选择)的实际字体。

询问选定特定DC的字体的API,如GetTextMetricsGetTextFace等,会为您提供有关实际字体的信息。

对于这个问题,Mark的回答(使用GetObject)可能总是有效,因为当您需要文本字体时,字体映射器选择符号字体的几率(反之亦然)是微不足道的。但是,一般情况下,当您想了解实际字体时,请找一种方法来询问HDC