- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
下图(放大,以便您更好地看到差异)显示了动态创建的编辑控件(上面的两个示例)和从对话框编辑器创建的编辑控件(下面的示例)之间的字体差异。我怎样才能让我动态创建的 CEdit 控件的字体看起来像默认的(下面的例子)?
我创建了 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.
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));
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);
SendMessageToDescendants
.它使初始化代码简单得多。
关于windows - 哪种字体是 MFC 对话框控件的默认字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6057239/
我想实现自定义搜索,但遇到了一个麻烦。我需要将 UIButton、SearchBar 组合在一个控件中,以便我可以通过指针引用它。然后我将向该组合控件动态添加更多 UIbutton。最重要的是,我想将
它没有在我的方法中执行 if block 中的语句 母版页:- 页面加载事件:- Control c = new Control(); DoSomething(c); 我的方法:- protecte
ComboBox 控件有一个 setConverter 方法,请参阅 JavaFX ComboBox - Display text but return ID on selection举个例子。我正在
我没有找到任何包含用于标记化(标记)文本输入的控件的 wpf 库。也许我找不到库,因为我错误地调用了这个组件。怎么叫或者哪里有这样的库? 最佳答案 DevExpress WPF 库包含多个数据编辑控件
是否有 Silverlight 控件允许您输入文本并将其突出显示为代码? 例如: foreach (client in Clients){ client.Save();} would become
我有以下用户控件 a) Panel.ZIndex="99999999" 是否是将此控件设置为该控件中 TopMost 的正
是否可以在 Windows 窗体中使用 C# 在窗体加载时隐藏所有特定控件,例如标签或按钮,然后选择显示我不想显示的那些? 我有一个包含很多按钮和标签的程序,但我只想在加载时显示一两个,我觉得对每个标
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Duplicating components at Run-Time 我有一个TMyControl ( Contro
我正在尝试在 Delphi 中编写一个 dll 库,其中包含一个创建 TFrame 后代实例并返回它的函数。但是当我在应用程序中导入这个函数时,每次调用它时,我都会得到一个异常,例如“'xxx'控件没
是否有 Win32 API 调用来确定哪些窗口和/或控件在特定坐标和/或鼠标下可见? 最佳答案 您可以使用GetWindowFromPoint 。它将返回窗口句柄,以便您可以使用 GetClassNa
我需要在编辑控件中输入以下公式: 公式是在 MS Word 中制作的。尝试将其复制/粘贴到编辑控件(单行或多行)后,我得到 M 0.33 Q10T9.1-9.7。 当我输入这个时,我正在研究 Rich
我只是想成功地将它添加到我的窗口中,但这却出奇地困难。 我已经尝试过 #include "windef.h" #include "winbase.h" #include "initguid.h" #i
我希望能够使用 google maps api v3 拥有自己的“街景”按钮。单击按钮时,我希望它根据我的标记经纬度加载街景。然后我希望按钮更改为“返回 map ”,然后再次加载默认 map View
我目前正在用 PHP 开发(另一个)开源 CMS,我想使用 javascript 控件,尤其是管理面板。问题是,是否有任何具有 PHP 接口(interface)的开源、可自由分发的控件(用于创建 j
我为其编写软件的产品之一是会计类应用程序。它用 C++ 编写,使用 C++ Builder 和 VCL 控件,连接到运行在 Linux 上的 PostgreSQL 数据库。 PostgreSQL 数据
我使用 Key Listener 来读取用户的输入,但我遇到了问题。首先,我读到 JTextField“请输入您的姓名”。如果用户输入一个名字,例如 John,它将更改为 John。但是,如果用户输入
我正在尝试对齐数据表列中的复选框(h=center,v=middle) ... 但复选框仍然显示在错误的位置(见附图)
我有一个包含统计信息的 JSON 数据树: { prefix: "a", count: 20, children: [ { prefix: "a:b", c
我在 Photoshop 中设计了一个模型,我打算将它应用到我的产品目录的 ListView 控件中,但它似乎没有正确显示(未对齐?),我希望这里的人可以像我一样指出我的错误试图弄清楚无济于事。 预期
您是使用 ASP.NET 控件还是仅使用带有 CSS 的 HTML? 我在 TextBox 和 DropDownList 的宽度方面遇到了一些问题。在不同的浏览器中,宽度会有所不同,控件的大小也不会相
我是一名优秀的程序员,十分优秀!