DotNET 中的硬编码字体

问题描述 投票:0回答:3

我曾多次遇到用户未在其计算机上安装 Windows Core 字体之一的问题(例如 Courier New、Comic Sans MS、Arial)。每当我尝试构建其中一个字体时,它都会抛出错误,而不是退回到相关的或实际上的任何其他字体。

如果我希望它是 Courier 字体,但我并不特别喜欢它,构建字体的最佳方法是什么?

.net fonts fallback construction
3个回答
3
投票

您可以将字体嵌入为资源并使用

unsafe
关键字(并且必须使用“不安全”进行编译)来获取字体...这是我用来将用户控件设置为“类型”字体的示例代码OCR':

私有 PrivateFontCollection pfc = new PrivateFontCollection();
私有字体_fntOCRFont = null;
私有枚举 FontEnum{
   光学字符识别 = 0
};

这声明了一个私有字体集合...使用命名约定将字体“OCR”嵌入为资源,其中“foo”是命名空间,因此资源名称将为“foo.ocraext.ttf”...看在“InitOCRFont”这里加载字体并将其添加到集合中:

私有无效InitOCRFont(){
   尝试{
      System.IO.Stream streamFont = this.GetType().Assembly.GetManifestResourceStream("foo.ocraext.ttf");
      if (streamFont != null){
          byte[] fontData = new byte[streamFont.Length];
          StreamFont.Read(fontData, 0, (int)streamFont.Length);
          StreamFont.Close();
          不安全{
                固定(字节* pFontData = fontData){
                   this.pfc.AddMemoryFont((System.IntPtr)pFontData, fontData.Length);
                }
          }
      }别的{
          throw new Exception("错误!无法读取内置字体。");
      }
   }catch(异常eX){
      throw new Exception("InitOCRFont 方法 - 发生异常!
例外是:“ + eX.Message);
   }
}

在这里,我在用户控件中设置控件,通过迭代集合将字体设置为“OCR”字体,请参阅“InitializeCtlFont”,字体大小为 10,并且是粗体“字体”:

私有无效InitializeCtlFont(){
    this._fntOCRFont = 新字体(this.pfc.Families[0], 10.0F, System.Drawing.FontStyle.Bold);
    if (this._fntOCRFont != null){
         foreach(在此控制ctl。Controls){
            if (ctl != null && ((ctl 是标签) || (ctl 是文本框))){
                        ctl.Font = this._fntOCRFont;
                    }
         }
    }
}

当用户控件被释放时,必须释放字体占用的资源,如

Dispose
方法中所示:

尝试{
   if (this._fntOCRFont != null) this._fntOCRFont.Dispose();
}抓住{
}
尝试{
   if (this.pfc != null) this.pfc.Dispose();
}抓住{
}

2
投票

好吧,你可以使用

FontFamily.GenericMonospace
来获得 a 等宽字体,而不是专门的 Courier:

Font f = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);

还有还有更多这样的通用字体系列

在尝试您喜欢的字体并遇到异常后,您也可以将此作为最后的手段。


2
投票

这很不寻常。 当您的程序请求目标计算机上不可用的字体时,Windows 字体映射器将始终提供替代字体。 XP 上的替代字体通常是 Microsoft Sans Serif,更高版本上的替代字体是 Segoe UI。 这些都不应该引起问题。

话又说回来,如果机器太混乱以至于没有可用的核心字体,它可能根本就没有可用的 TrueType 字体。 是的,那会轰炸你的程序。 坦率地说,这不是您应该处理的事情,除非这是一个非常有价值的客户。 否则,您的客户支持团队可以轻松解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.