我在将资源中的字体加载到PrivateFontCollection时遇到了一些困难。
当我开始这个时,我成功地从文件中加载字体,但是我希望将字体嵌入到我的项目中(因此用户端的文件更少,而应用程序时的IO更少)运行)。
以下代码将加载字体,获取正确的名称,并允许缩放,但没有任何字符正确显示。
static class Foo {
public static string FontAwesomeTTF { get; set; }
public static Font FontAwesome { get; set; }
public static float Size { get; set; }
public static FontStyle Style { get; set; }
private static PrivateFontCollection pfc { get; set; }
static Foo() {
// This was set when loading from a file.
// FontAwesomeTTF = "fontawesome-webfont.ttf";
Style = FontStyle.Regular;
Size = 20;
if ( pfc==null ) {
pfc=new PrivateFontCollection();
if ( FontAwesomeTTF==null ) {
var fontBytes=Properties.Resources.fontawesome_webfont;
var fontData=Marshal.AllocCoTaskMem( fontBytes.Length );
Marshal.Copy( fontBytes, 0, fontData, fontBytes.Length );
pfc.AddMemoryFont( fontData, fontBytes.Length );
Marshal.FreeCoTaskMem( fontData );
} else {
pfc.AddFontFile( FontAwesomeTTF );
}
}
FontAwesome = new Font(pfc.Families[0], Size, Style);
}
private static string UnicodeToChar( string hex ) {
int code=int.Parse( hex, System.Globalization.NumberStyles.HexNumber );
string unicodeString=char.ConvertFromUtf32( code );
return unicodeString;
}
public static string glass { get { return UnicodeToChar("f000"); } }
}
使用示例:
label1.Font = Foo.FontAwesome;
label1.Text = Foo.glass;
我在嵌入式资源和基于文件的测试中使用当前的FontAwesome TTF文件。似乎嵌入式内容在翻译中丢失或加扰或从嵌入式加载时。我需要帮助才能完成这项工作,因此我可以将嵌入资源中的字体加载到PrivateFontCollection中。
有一些解决方案'我查看了SO,但它们已经过时了,Visual Studio 2013中不再提供部分或全部命令/访问器(文章解决方案来自4 - 5年前)。一些示例'解决方案'以及他们为什么不工作:
Solution #1 - 这不起作用,因为字体的访问者字符串返回null。就我而言,访问者是MyProject.Properties.Resources.fontawesome_webfont
Solution #2 - 此解决方案最接近,但用于访问资源的方法再次不再有效。我上面的代码实现了一个收获的版本,取出了将byte []数组传递到内存然后从内存加载的核心概念。由于在我的情况下资源的get {}属性已经返回一个byte []数组,因此无需转换'它成为一个字节数组,因此我(似乎)安全地能够通过更新它来使用更新的访问器来删除该部分代码。
在任何一种情况下,我想要一个解决这个问题的方法,它允许我将嵌入资源中的字体文件加载到PrivateFontCollection中。
答案 0 :(得分:3)
AddMemoryFont
's remarks section说:
要使用内存字体,必须使用GDI +呈现控件上的文本。使用
SetCompatibleTextRenderingDefault
方法,传递true
,通过将控件的UseCompatibleTextRendering
属性设置为true
,在应用程序或个别控件上设置GDI +呈现。某些控件无法使用GDI +进行渲染。
我在本地重现了您的问题并通过将您的使用示例更改为:
进行了尝试label1.Font = Foo.FontAwesome;
label1.Text = Foo.glass;
label1.UseCompatibleTextRendering = true;
这会打开该标签的GDI +渲染,允许添加AddMemoryFont
的字体正确呈现。