TLDNR:现在是 2017。使用System.Drawing.createfont时如何设置字体粗细
更长的版本:在 GDI32 下,我将创建一个设备上下文,填写一个 LOGFONT 结构,包括一个重量值,如 400,500,600 等,并创建字体。字体映射器将运行一个算法来将我的请求与系统上可用的最佳匹配字体相匹配,并返回一个句柄。
在 system.drawing 下,字体构造函数有 13 个重载,但没有一个具有明显的权重。有一个 FontFamily 参数,但唯一的权重效果是添加一个二进制“粗体”选项,这与设置所需的字体粗细不同。
为什么这很重要:字体有家族和重量变体。重量是字母的粗细或暗度。在排版中,如果我需要半粗体字体,那么我真的必须得到半粗体版本的字体,假设它安装在运行代码的机器上。
到目前为止我做了什么?通过谷歌、SO 和 MSDN 进行了大量基于网络的研究。在我写这篇文章时,我查看了所有建议的问题。到目前为止,我还没有找到前进的方向,而我正处于那个时候,你知道你在问错误的问题,并在寻找能指引我回到正确方向的人。
在 GDI 下是可能的 - system.drawing equiv 是什么。
编辑:这个问题来自一个实际使用directWrite(dw)的当前项目,而不是system.drawing。但是要求之一是知道请求的字体可用。使用 GDI32 思维方式,在 dw 中似乎没有明显的解决方案,因此我们转向 system.drawing,问题就出现了。
在对这个问题的初步回应评论引发了更多研究之后,我们有了一个启发性的时刻。这是在 dw 中请求字体的方式与 GDI32 完全不同。dw使用字体族/粗细/宽度/斜率字体模型进行字体匹配。它还使字体系列变体枚举变得容易。
我们来自一个遗留用例,其中我们的数据包括 GDI32 字体名称。这通常是姓氏,但各种字体铸造厂以不同的方式使用它,如果你有像TypeTool这样的字体内部工具,你可以观察到这一点——一个铸造厂可能将他们的粗斜体版本称为“MyFont Bold Italic”,而另一个将他们的称为“MyFont” ' 并将粗斜体说明符保留在其他字体参数中。
与此同时,Windows(至少是 Windows 10)似乎已经更新了它在安装时映射字体的方式,识别蹩脚的名称并将其作为一个家族呈现。MS Office 似乎没有加入这种方法(例如 PowerPoint 字体选择列表中的蹩脚名称),但如果您浏览 Windows/fonts 文件夹,您可以看到它。
现在,这一切都非常好,但是如果您只使用旧版 GDI32 字体名称并尝试在 dw 中实例化字体,它将失败。解决方案似乎是对 GDI32 字体名称进行预处理,以去除粗细、宽度和斜率枚举词。完成后,dw 将匹配您的字体。
这种方法在初始测试中似乎非常可行,而且当字体确实不存在时,我们可以轻松返回一些丑陋的默认值,例如“Courier”,此外,如果我们想要选择,我们可以廉价地获得字体家族成员的列表如果所需的成员不存在,则另一个成员(我知道如果我们走这条路,我们倾向于重新发明字体映射器)。
结论:dw字体命名与GDI32不同。您可能在 GDI32 中使用的更奇特的字体名称不能保证与 dw 一起使用,并且需要按摩成 dw 格式,但它是可行的。
我稍后会更新上述方法的结果。