我发现 Win32 ChooseFont() API 的行为有些奇怪,更重要的是不一致。
LOGFONT lf = { 0 };
strcopy(lf.lfFaceName, m_face_name);
const int ppi = GetDeviceCaps(pView, LOGPIXELSY);
lf.lfHeight = -MulDiv(m_font_height, ppi, 72);
CFontDialog fd(&lf);
if (fd.DoModal() != IDOK)
return;
m_face_name = fd.GetFaceName();
m_font_height = lf.lfHeight;
假设第一次,人脸名称是“Segoe UI”,这是可行的。
但是如果用户将对话框更改为“Segoe UI”、“Light”、“9”、(面部、样式、高度),并且我们再次执行上述操作,则字体选择常用对话框无法选择“ Segoe UI”作为人脸名称。相反,我将 Font: 字段设为空白。
如果用户选择“Regular”、“Italic”、“Bold”、“Bold Italic”的样式,这不是问题,因为这些样式存储在样式位中,并且不会混淆名称。我在第二次运行时丢弃它们,因为我忽略了它们(我会禁用字体样式:如果有一种方法可以轻松做到这一点 - 我不希望为此子类化 CFontDialog - 这是一个完整的“另一个时间级别”和此刻不允许的努力)。
我尝试根据对话框中的先前细节创建一种字体,然后尝试将 LOGFONT 拉出。没有骰子。
同样,我尝试在对话框中查询 FontStyle() - 但它返回空白 - 所以这里没有什么可以从字体名称中删除......
这似乎是 MS 对话框的一个错误 - 它告诉我一件事,但随后无法使用它自己的输出在第二次通过时正确初始化自身(当然,在这种情况下,我只是保留了部分而不是全部 LOGFONT )。
有谁知道 WTH 有这个想法吗?或者我可能会使用的一种方法(在字体名称末尾寻找“Light”的硬编码 - 太糟糕了!)?