使用 System.Drawing.Font.FromHfont(IntPtr hfont) 从 SYSTEM_FONT Stock 对象创建 System.Drawing.Font
Posted
技术标签:
【中文标题】使用 System.Drawing.Font.FromHfont(IntPtr hfont) 从 SYSTEM_FONT Stock 对象创建 System.Drawing.Font【英文标题】:System.Drawing.Font Creation From SYSTEM_FONT Stock Object using System.Drawing.Font.FromHfont(IntPtr hfont) 【发布时间】:2020-03-24 13:32:01 【问题描述】:我正在尝试使用 System.Drawing.Font.FromHfont(IntPtr hfont)
的 SYSTEM_FONT 库存对象创建 System.Drawing.Font 的实例,如下所示:
static Font GetStockFont(StockObjects index)
Font returnFont = Font.FromHfont(GetStockObject(index));
return returnFont;
[DllImport("gdi32.dll")]
static extern IntPtr GetStockObject(StockObjects fnObject);
enum StockObjects
WHITE_BRUSH = 0,
LTGRAY_BRUSH = 1,
GRAY_BRUSH = 2,
DKGRAY_BRUSH = 3,
BLACK_BRUSH = 4,
NULL_BRUSH = 5,
HOLLOW_BRUSH = NULL_BRUSH,
WHITE_PEN = 6,
BLACK_PEN = 7,
NULL_PEN = 8,
OEM_FIXED_FONT = 10,
ANSI_FIXED_FONT = 11,
ANSI_VAR_FONT = 12,
SYSTEM_FONT = 13,
DEVICE_DEFAULT_FONT = 14,
DEFAULT_PALETTE = 15,
SYSTEM_FIXED_FONT = 16,
DEFAULT_GUI_FONT = 17,
DC_BRUSH = 18,
DC_PEN = 19
但是当我这样做时,我得到了以下System.ArgumentException
异常,有什么我遗漏的吗?我的印象是 GetStockObject 在这种情况下会返回一个正确的 HFont:
Only TrueType fonts are supported. This is not a TrueType font.
【问题讨论】:
您可以使用WHITE_BRUSH
获得有效的字体句柄(您将获得默认大小的默认字体:12 磅)。 NULL_BRUSH
将为您提供相同的默认字体,但在通用上下文中可用的最小尺寸,1.5
点。其他一些股票对象(LTGRAY_BRUSH
、GRAY_BRUSH
,但不是BLACK_BRUSH
)将返回相同的 hFont 对象。 DEFAULT_GUI_FONT
将返回 Microsoft Sans Serif, 8.25
积分。其他人不会给你一个兼容的对象。
【参考方案1】:
你可能忽略的:
根据MSDN:系统字体。系统默认使用系统字体绘制 菜单、对话框控件和文本。不建议您 使用 DEFAULT_GUI_FONT 或 SYSTEM_FONT 获取对话框使用的字体 和窗户;有关详细信息,请参阅备注部分。这 默认系统字体为 Tahoma。
An ancient document:
您可以使用 GetStockObject 函数获得两个 称为 SYSTEM_FONT 和 DEFAULT_GUI_FONT 的字体。它们是什么?
它们是没有人再使用的字体了。
在 Windows 2.0 的旧时代,用于对话框的字体 是一种名为 System. 的位图字体。这是 SYSTEM_FONT 的字体 检索,它仍然是默认的对话框字体 兼容性原因。当然,现在没有人会使用这种 他们的对话框的丑陋字体。 (除其他外,它是一个 位图字体,因此在高分辨率下看起来不太好,也不 可以抗锯齿吗?)
DEFAULT_GUI_FONT 的历史就更不显眼了。它被创造了 在 Windows 95 开发期间,希望成为新的默认设置 GUI 字体,但到 1994 年 7 月,Windows 本身停止使用它以支持 SystemParametersInfo 函数返回的各种字体。 它的存在现在已经不复存在了。
SYSTEM_FONT 和 DEFAULT_GUI_FONT 的一个主要问题是 典型的美英机器,它们映射到不支持的位图字体 支持 ClearType。
如果你想使用DEFAULT_GUI_FONT
,可以参考@RbMm's answer,通过SystemParametersInfo(SPI_GETNONCLIENTMETRICS)
获取NONCLIENTMETRICS
,然后使用LOGFONT
数据,创建自己的字体。或者您可以查询SystemParametersInfo(SPI_GETICONTITLELOGFONT)
并使用它。
希望能帮到你:)
【讨论】:
以上是关于使用 System.Drawing.Font.FromHfont(IntPtr hfont) 从 SYSTEM_FONT Stock 对象创建 System.Drawing.Font的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)