我在很多情况下都遇到过问题,因为用户没有在他们的机器上安装任何一种 Windows Core 字体(例如 Courier New、Comic Sans MS、Arial)。每当我尝试构建其中一个字体时,它都会引发错误,而不是退回到相关的,或者实际上是任何其他字体。
如果我希望它是 Courier,构建字体的最佳方法是什么,但我并不特别喜欢它?
我在很多情况下都遇到过问题,因为用户没有在他们的机器上安装任何一种 Windows Core 字体(例如 Courier New、Comic Sans MS、Arial)。每当我尝试构建其中一个字体时,它都会引发错误,而不是退回到相关的,或者实际上是任何其他字体。
如果我希望它是 Courier,构建字体的最佳方法是什么,但我并不特别喜欢它?
您可以将字体作为资源嵌入并使用unsafe关键字(并且必须使用“不安全”编译)来获取字体...这是我用来将用户控件设置为“OCR”类型字体的示例代码
私有 PrivateFontCollection pfc = new PrivateFontCollection();
私人字体_fntOCRFont = null;
私有枚举 FontEnum{
OCR = 0
};
这声明了一个私有的字体集合......字体'OCR'使用命名约定作为资源嵌入,其中'foo'是一个命名空间,因此资源名称将是'foo.ocraext.ttf'......看看'InitOCRFont' 在这里加载字体并将其添加到集合中:
私人无效InitOCRFont(){
尝试{
System.IO.Stream streamFont = this.GetType().Assembly.GetManifestResourceStream("foo.ocraext.ttf");
如果(流字体!= 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 方法 - 发生异常!\n异常是:" + eX.Message);
}
}
在这里,我设置用户控件中的控件,通过遍历集合将字体设置为“OCR”字体,参见“InitializeCtlFont”,字体大小为 10,并且是粗体“字体”:
私人无效 InitializeCtlFont(){
this._fntOCRFont = new Font(this.pfc.Families[0], 10.0F, System.Drawing.FontStyle.Bold);
if (this._fntOCRFont != null){
foreach(在 this.Controls 中控制 ctl){
if (ctl != null && ((ctl is Label) || (ctl is TextBox))){
ctl.Font = this._fntOCRFont;
}
}
}
}
当用户控件被释放时,必须释放字体占用的资源,Dispose方法如下所示:
尝试{
if (this._fntOCRFont != null) this._fntOCRFont.Dispose();
}抓住{
}
尝试{
if (this.pfc != null) this.pfc.Dispose();
}抓住{
}
希望这会有所帮助,最好的问候,汤姆。
好吧,您可以使用FontFamily.GenericMonospace获取等宽字体,而不是专门的Courier:
Font f = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);
还有一些这样的通用字体系列。
在尝试了首选字体并遇到异常后,您也可以将其用作最后的手段。
这是非常不寻常的。当您的程序请求目标计算机上不可用的字体时,Windows 字体映射器将始终提供替代字体。该替代字体通常是 XP 上的 Microsoft Sans Serif,更高版本上的 Segoe UI。这些都不应该引起问题。
再说一次,如果机器太乱以至于没有可用的核心字体,它可能根本没有可用的 TrueType 字体。是的,那会轰炸你的程序。坦率地说,这不是你应该处理的事情,除非这是一个真正有价值的客户。否则,您的客户的支持团队可以轻松解决。