gpt4 book ai didi

windows - 哪种字体是 MFC 对话框控件的默认字体?

转载 作者:可可西里 更新时间:2023-11-01 11:59:22 39 4
gpt4 key购买 nike

下图(放大,以便您更好地看到差异)显示了动态创建的编辑控件(上面的两个示例)和从对话框编辑器创建的编辑控件(下面的示例)之间的字体差异。我怎样才能让我动态创建的 CEdit 控件的字体看起来像默认的(下面的例子)?

enter image description here

我创建了 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 以来就没有使用过的位图字体。更多信息可在 Raymond Chen's blog 上找到。 , 和 Michael Kaplan's blog .

第二个例子是使用 "MS Shell Dlg" font ,就像你要求的那样。这实际上映射到一种名为“Microsoft Sans Serif”或“MS Sans Serif”的字体,这是 Windows 95 和 98 时代的 UI 字体。这也称为 DEFAULT_GUI_FONT ,这确实曾经是它的准确名称,但唉,它不再准确了。

从 Windows 2000 开始(并在 XP 中继续),Tahoma 被用作默认的 UI 字体。这就是您在第三个示例中看到的内容:Tahoma 8 pt。不幸的是,即使在这些操作系统上,“MS Shell Dlg”也不返回 Tahoma——它仍然返回 MS Sans Serif,这就是它看起来错误的原因。

因此,您可以简单地将 Tahoma 指定为 GUI 字体,但这实际上并不正确,因为它会在未安装或支持 Tahoma 的旧版操作系统或外语版本的操作系统中中断,出于必要使用不同字体的地方。相反,您应该指定 DS_SHELLFONT标志,其中 Raymond talks about here .

在 Windows Vista 出现之前,一切都很好。在 Windows Vista 中,Microsoft 的权力决定 Tahoma 有点老了,而 Windows 的到期日期是 another UI font upgrade .他们在内部开发了自己的特殊字体,称为 Segoe UI ,据说是为获得最佳屏幕可读性而设计的。在一个特殊的小转折中,他们决定默认大小现在应该是 9 点 , 而不是每个以前版本的操作系统使用的 8 pt,无论字体如何。您可能会认为“MS Shell Dlg”、“MS Shell Dlg2”或 DS_SHELLFONT (或所有三个)会给你这个新奇的 Segoe UI 字体,但你错了。

哦哦。现在事情变得棘手了... Vista 不仅使用了与 XP 不同的字体,使用通用标识符不容易访问,而且它还使用了不同的 尺寸 , 改变你的对话框在这些系统上的显示方式,如果你可以让它显示的话。在很多很多地方,Windows shell 团队似乎只是简单地应对挑战——Tahoma 8 pt 被到处使用,即使启用了 Aero 主题,当它应该使用 Segoe UI 9 pt 时也是如此。这种东西确实让 UI 看起来很粗糙,而且在 Vista 的早期,它是很多吹毛求疵的主题。现在,似乎大多数人已经忘记了它,但 UI 并没有开始看起来不那么分散和不一致。

而且您不是 Windows shell 团队:您无法在自己的应用程序中摆脱这种情况。 Top Rules for the Windows Vista User Experience甚至明确声明您应该始终:

  • Use Segoe UI, the new Windows Vista system font.
  • Respect the user's settings by always referencing the system font, sizes, and colors using the Windows Theme APIs. Don't use fixed values for fonts, sizes, or colors.


老实说,我还没有真正听说过这个问题的好的解决方案。而且我怀疑到我这样做的时候,没有人会再需要支持 Windows XP(尽管大多数人还没有完全支持)。但这是我所做的:我在运行时使用 SystemParametersInfo function 提取默认系统字体.幸运的是,系统消息框字体 ( lfMessageFont ) 是正确的字体和大小,无论当前版本的 Windows 和用户选择的主题如何。

我初始化窗口或对话框的代码通常看起来像这样( SystemInfo::IsVistaOrLater 是我编写的辅助函数;实现是显而易见的):
// 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));

或者在 MFC 中更容易,使用方便的 SendMessageToDescendants方法
( m_DlgFont 是为类定义的 CFont 对象):
// Get the system message box font
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0);
LOGFONT lfDlgFont = ncm.lfMessageFont;
m_DlgFont.CreateFontIndirect(&lfDlgFont);

// Set the dialog and all its controls to use the system message box font
SetFont(m_DlgFont, TRUE);
SendMessageToDescendants(WM_SETFONT, (WPARAM)m_DlgFont.m_hFont, MAKELPARAM(FALSE, 0), TRUE);

如果您不使用 MFC,我强烈建议您实现自己的递归版本 SendMessageToDescendants .它使初始化代码简单得多。

关于windows - 哪种字体是 MFC 对话框控件的默认字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6057239/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com