You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms中Terminal字体创建失败,明明系统已预装该字体?

解决Terminal字体无法通过FontFamily创建的问题

这个问题其实是GDI+和Windows底层GDI字体处理机制的差异导致的——Terminal是Windows预装的光栅字体(Raster Font),而你用的FontFamily类是基于GDI+实现的,GDI+默认只支持TrueType/OpenType这类轮廓字体,对光栅字体的支持非常有限。哪怕字符映射表(依赖GDI)能显示它,GDI+也没法直接通过名称创建FontFamily实例,这就是报错的原因。

为什么字符映射表里能看到Terminal?

字符映射表是基于传统GDI API实现的,GDI对Windows的光栅字体有完善的支持,所以能正常显示和调用,但GDI+作为后来的图形库,为了性能和跨平台性,砍掉了对光栅字体的直接支持。

可行的解决方案(针对你的RichTextBox场景)

因为你最终是要给RichTextBox设置字体,不需要单独创建FontFamily实例,推荐用下面两种简单的方法:

方法1:直接用Font构造函数创建(最简便)

跳过FontFamily,直接用Font的构造函数指定Terminal字体名——底层会自动 fallback 到GDI的逻辑,能正确加载光栅字体:

Font terminalFont;
try
{
    // 第二个参数是字体大小,按需调整
    terminalFont = new Font("Terminal", 10);
}
catch (ArgumentException)
{
    // 极端兜底情况(虽然Terminal是预装的,但留个保险)
    terminalFont = SystemFonts.DefaultFont;
}
// 给RichTextBox设置字体
yourRichTextBox.Font = terminalFont;

方法2:验证Terminal字体存在(可选,更严谨)

如果一定要先确认Terminal字体是否真的存在,可以用GDI的EnumFontFamiliesEx API枚举系统字体(需要P/Invoke),找到对应光栅字体后再创建。不过这个代码相对复杂,对于你的场景来说,方法1已经足够满足需求。

额外验证步骤

你可以打开「控制面板 > 字体」,找到Terminal字体右键查看属性,在「详细信息」标签里看「字体类型」,会显示为「光栅字体」——这就坐实了它不是GDI+支持的轮廓字体类型。

内容的提问来源于stack exchange,提问作者Aging Hippie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:32:53