下图(放大后,您会更好地看到它们的区别)显示了动态创建的Edit控件(上面的两个示例)和从Dialog Editor创建的Edit控件(下面的示例)之间的Font差异。如何使动态创建的CEdit控件的字体看起来像默认字体(下面的示例)?
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS94b3pyTS5wbmcifQ==” alt =“在此处输入图像描述”>
我已经创建了如下的CEdit控件:
obj->CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""),
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
rect.left, rect.top, rect.Width(), rect.Height(),
GetSafeHwnd(), reinterpret_cast<HMENU>(mId));
obj->SetFont(&mFont); // mFont was created in the Dialog Constructor
// with mFont.CreatePointFont(80, _T("MS Shell Dlg"));
感谢您的帮助!
[第一个示例使用的是系统字体(SYSTEM_FONT
),该字体是通过GetStockObject
function检索的,这是自Windows 3以来就没有使用过的位图字体。有关更多信息,请参见GetStockObject
,和Raymond Chen's blog。
第二个示例正在使用Michael Kaplan's blog,就像您要求的那样。实际上,它映射为一种名为“ Microsoft Sans Serif”或“ MS Sans Serif”的字体,这是Windows 95和98时代的UI字体。这也称为"MS Shell Dlg" font,它的确是它的准确名称。它,但是可惜,它不再准确了。
[从Windows 2000开始(并在XP中继续使用),Tahoma被用作默认的UI字体。这是您在第三个示例中看到的:Tahoma 8 pt。不幸的是,即使在那些操作系统上,“ MS Shell Dlg”也不会返回Tahoma -它仍会返回MS Sans Serif,这就是为什么它看起来不对的原因。
因此,您可以简单地将Tahoma指定为GUI字体,但这并不是真的,因为在未安装或不支持Tahoma的较旧版本的OS中,或者在操作系统的外语版本中,它都会中断系统,必要时使用其他字体。相反,您应该指定DEFAULT_GUI_FONT
标志,即DS_SHELLFONT
。
在Windows Vista出现之前,一切都很好。在Windows Vista中,Microsoft的权力决定Tahoma变得有点long不休,而Windows应该是Raymond talks about here。他们内部开发了自己的特殊字体another UI font upgrade,据说该字体旨在实现最佳的屏幕可读性。并做了一点特别的修改,他们决定默认大小现在应该为9 pt,而不是操作系统的每个以前版本使用的8 pt,而不管字体是什么字体。您可能会[]可能认为“ MS Shell Dlg”,“ MS Shell Dlg2”或Segoe UI(或全部三个)会为您提供这种新型的Segoe UI字体,但是您错了。 呃哦。现在事情变得棘手了……Vista不仅使用不同于XP的字体(使用单一尺寸的所有人标识符很难访问),而且还使用不同的 sizeDS_SHELLFONT
甚至明确声明您应该始终:
使用Segoe UI,新的Windows Vista系统字体。解决方案。而且我怀疑,到现在为止,已经没有人需要支持Windows XP了(尽管大多数人还没有支持[XP])。但是,我的工作是:在运行时使用Top Rules for the Windows Vista User Experience提取默认系统字体。幸运的是,无论当前版本的Windows和用户选择的主题如何,系统消息框字体(通过始终使用Windows Theme API引用系统字体,大小和颜色来尊重用户的设置。不要对字体,大小或颜色使用固定值。
坦白说,我还没有真正听说过此问题的 good
SystemParametersInfo
function)都是正确的字体和大小。我初始化窗口或对话框的代码通常看起来像这样(SystemParametersInfo
是我编写的一个辅助函数;很明显实现是这样的:]
lfMessageFont
甚至使用方便的SystemInfo::IsVistaOrLater
方法在MFC中更容易(// Get the system message box font
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);
// If we're compiling with the Vista SDK or later, the NONCLIENTMETRICS struct
// will be the wrong size for previous versions, so we need to adjust it.
#if(_MSC_VER >= 1500 && WINVER >= 0x0600)
if (!SystemInfo::IsVistaOrLater())
{
// In versions of Windows prior to Vista, the iPaddedBorderWidth member
// is not present, so we need to subtract its size from cbSize.
ncm.cbSize -= sizeof(ncm.iPaddedBorderWidth);
}
#endif
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
HFONT hDlgFont = CreateFontIndirect(&(ncm.lfMessageFont));
// Set the dialog to use the system message box font
SetFont(m_DlgFont, TRUE);
SendMessage(hWnd, WM_SETFONT, (WPARAM)hDlgFont, MAKELPARAM(FALSE, 0));
是为该类定义的SendMessageToDescendants
对象):m_DlgFont
如果您不使用MFC,我强烈建议您实现自己的CFont
的递归版本。它使初始化代码变得更简单。