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
相关产品推荐
相关产品推荐

