使用 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_BRUSHGRAY_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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)