问题:
有没有办法检查给定字体是否是 Microsoft 的ClearType 优化字体之一?
我想我可以简单地对字体名称列表进行硬编码,因为它是一个相对较短的列表,但这看起来有点难看。无论 Windows 的区域设置和语言设置如何,字体名称都会相同吗?
背景:
PuTTY带有粗体、支持 ClearType 的 Consolas 文本,看起来真的很难看。我决定使用源代码,看看是否能找出问题所在,我想我将其追踪到以下(缩写)代码:
font_height = cfg.font.height;
if (font_height > 0) {
font_height =
-MulDiv(font_height, GetDeviceCaps(hdc, LOGPIXELSY), 72);
}
}
font_width = 0;
#define f(i,c,w,u) \
fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \
c, OUT_DEFAULT_PRECIS, \
CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \
FIXED_PITCH | FF_DONTCARE, cfg.font.name)
f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);
SelectObject(hdc, fonts[FONT_NORMAL]);
GetTextMetrics(hdc, &tm);
font_height = tm.tmHeight;
font_width = tm.tmAveCharWidth;
f(FONT_BOLD, cfg.font.charset, fw_bold, FALSE);
目的是选择与普通字体尺寸相同的粗体字体。我假设 PuTTY 的 Consolas 文本看起来很难看,因为由于 Consolas 被高度优化以布置在特定像素边界上,试图将其硬塞到任意尺寸会产生不好的结果。
因此,一个合适的修复方法似乎是检测 ClearType 优化字体并尝试使用与初始 CreateFont 调用相同的宽度和高度创建这些字体的粗体版本。