DotNET中的硬编码字体

时间:2010-03-06 13:32:59

标签: .net fonts fallback construction

我在很多用户没有安装过其中一种Windows Core字体的情况下遇到了问题(例如Courier New,Comic Sans MS,Arial)。每当我尝试构建其中一个时,它会抛出一个错误,而不是回到相关的,或者真的,任何其他字体。

如果我希望它是Courier,那么构建Font的最佳方法是什么,但我不是特别坚持它?

3 个答案:

答案 0 :(得分:4)

您可以将字体嵌入为资源并使用unsafe关键字(并且必须使用'unsafe'编译)来获取字体...这是我用来将用户控件设置为的示例代码“OCR”的字体

private PrivateFontCollection pfc = new PrivateFontCollection();
private Font _fntOCRFont = null;
private enum FontEnum{
   OCR = 0
};

声明私有字体集合...字体'OCR'使用命名约定嵌入为资源,其中'foo'是命名空间,因此资源名称为'foo.ocraext.ttf'。 。点击'InitOCRFont',加载字体并将其添加到集合中:

private void InitOCRFont(){
   try{
      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();
          unsafe{
                fixed(byte *pFontData = fontData){
                   this.pfc.AddMemoryFont((System.IntPtr)pFontData, fontData.Length);
                }
          }
      }else{
          throw new Exception("Error! Could not read built-in Font.");
      }
   }catch(Exception eX){
      throw new Exception("InitOCRFont Method - Exception occurred!\nException was: " + eX.Message);
   }
}

在这里,我在User控件中设置控件,通过遍历集合将字体设置为'OCR'字体,请参阅'InitializeCtlFont',字体大小为10并且是粗体'type-face':< / p>

private void InitializeCtlFont(){
    this._fntOCRFont = new Font(this.pfc.Families[0], 10.0F, System.Drawing.FontStyle.Bold);
    if (this._fntOCRFont != null){
         foreach(Control ctl in this.Controls){
            if (ctl != null && ((ctl is Label) || (ctl is TextBox))){
                        ctl.Font = this._fntOCRFont;
                    }
         }
    }
}

当用户控件被释放时,必须释放字体占用的资源,如Dispose方法中所示:

try{
   if (this._fntOCRFont != null) this._fntOCRFont.Dispose();
}catch{
}
try{
   if (this.pfc != null) this.pfc.Dispose();
}catch{
}

希望这有帮助, 最好的祝福, 汤姆。

答案 1 :(得分:2)

好吧,您可以使用FontFamily.GenericMonospace来获取 a Monospace字体,而不是特别是Courier:

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

a few more such generic font families as well

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

答案 2 :(得分:2)

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

然后,再次,如果机器搞砸了它没有可用的核心字体,它可能根本没有可用的TrueType字体。是的,这会轰炸你的程序。坦率地说,这不是你应该处理的事情,除非这是一个非常有价值的客户。它可以由您的客户支持团队轻松解决。