我在很多用户没有安装过其中一种Windows Core字体的情况下遇到了问题(例如Courier New,Comic Sans MS,Arial)。每当我尝试构建其中一个时,它会抛出一个错误,而不是回到相关的,或者真的,任何其他字体。
如果我希望它是Courier,那么构建Font的最佳方法是什么,但我不是特别坚持它?
答案 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字体。是的,这会轰炸你的程序。坦率地说,这不是你应该处理的事情,除非这是一个非常有价值的客户。它可以由您的客户支持团队轻松解决。