我正在尝试使用[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.
根据MSDN:系统字体。默认情况下,系统使用系统字体绘制菜单,对话框控件和文本。不建议您使用DEFAULT_GUI_FONT或SYSTEM_FONT获得对话框使用的字体和窗户;有关更多信息,请参见备注部分。的默认系统字体是Tahoma。
使用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,通过NONCLIENTMETRICS
获得SystemParametersInfo(SPI_GETNONCLIENTMETRICS)
,然后将其用作LOGFONT
数据,以创建自定义字体。或者您可以查询SystemParametersInfo(SPI_GETICONTITLELOGFONT)
并使用它。希望为您提供帮助:)