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

问题描述 投票:43回答:1

下图(放大后,您会更好地看到它们的区别)显示了动态创建的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"));

感谢您的帮助!

windows visual-studio visual-studio-2008 winapi mfc
1个回答
87
投票

[第一个示例使用的是系统字体(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字体,但是您错了。 呃哦。现在事情变得棘手了……Vis​​ta不仅使用不同于XP的字体(使用单一尺寸的所有人标识符很难访问),而且还使用不同的

size

,从而改变了对话框的方式如果您能完全显示它,它将在那些系统上查看。在很多地方,Windows Shell团队似乎只是在挑战一下-在应该启用Segoe UI 9 pt的情况下,即使启用了Aero主题,Tahoma 8 pt仍被使用[[over the place。这种事情确实使UI看起来不整洁,并且在Vista的早期就成为了很多挑剔的主题。现在,似乎大多数人已经忘记了它,但是UI并没有开始看起来更加分散和不一致。而且您不是Windows Shell团队:您无法在自己的应用程序中摆脱这一难题。 DS_SHELLFONT甚至明确声明您应该始终:

使用Segoe UI,新的Windows Vista系统字体。
    通过始终使用Windows Theme API引用系统字体,大小和颜色来尊重用户的设置。不要对字体,大小或颜色使用固定值。
  • 坦白说,我还没有真正听说过此问题的
  • good
  • 解决方案。而且我怀疑,到现在为止,已经没有人需要支持Windows XP了(尽管大多数人还没有支持[XP])。但是,我的工作是:在运行时使用Top Rules for the Windows Vista User Experience提取默认系统字体。幸运的是,无论当前版本的Windows和用户选择的主题如何,系统消息框字体(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的递归版本。它使初始化代码变得更简单。

    © www.soinside.com 2019 - 2024. All rights reserved.