我刚刚将ttf文件添加到项目(c#2008 express)作为“文件”并构建了嵌入式资源的选项。
尝试设置此字体时遇到问题: (我知道下一行是错误的......)
this.label1.Font = AlarmWatch.Properties.Resources.Baby_Universe;
错误1无法隐式转换类型 'byte []'到 'System.Drawing.Font'C:\ Users \ hongo \ Documents \ Visual 工作室 2008 \ Projects \ AlarmWatch \ AlarmWatch \ Form1.Designer.cs 57 32 AlarmWatch
我知道它是byte []因为我将选项build设置为嵌入式资源,但是与这行正确比较:
this.label1.Font = new System.Drawing.Font("OCR A Extended",
24F, System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
如何设置this.label1以使用新字体?
答案 0 :(得分:2)
AddMemoryFont
命名空间中有一个System.Drawing.Text
方法,它从内存中加载一个字体(它需要一个指向内存块的指针,所以你需要做一些不安全的操作来获取指向字节数组的指针 - 我找到了example here)。有关method on MSDN的更多信息。
还有一个相关的StackOverflow question显示如何导入Win API函数以直接加载字体(如果上面的.NET方法不起作用)。
编辑 Visual Basic中关键部分的翻译可能如下所示(虽然没有检查过):
// This should be probably a field of some class
PrivateFontCollection pfc = new PrivateFontCollection();
// allocate memory and copy byte[] to the location
IntPtr data = Marshal.AllocCoTaskMem(yourByteArray.Length);
Marshal.Copy(yourFontArray, 0, data, yourFontArray.Length);
// pass the font to the font collection
pfc.AddMemoryFont(data, fontStream.Length)
// Free the unsafe memory
Marshal.FreeCoTaskMem(data)
一旦你有这个,你应该能够使用它的通常名称来引用字体。
答案 1 :(得分:0)
我通过阅读C# : Using an embedded font on a textbox
上的前一个答案解决了这个问题感谢Tomas的链接。
答案 2 :(得分:0)
private static void AddFontFromResource(PrivateFontCollection privateFontCollection, string fontResourceName)
{
var fontBytes = GetFontResourceBytes(typeof (App).Assembly, fontResourceName);
var fontData = Marshal.AllocCoTaskMem(fontBytes.Length);
Marshal.Copy(fontBytes, 0, fontData, fontBytes.Length);
privateFontCollection.AddMemoryFont(fontData, fontBytes.Length);
Marshal.FreeCoTaskMem(fontData);
}
private static byte[] GetFontResourceBytes(Assembly assembly, string fontResourceName)
{
var resourceStream = assembly.GetManifestResourceStream(fontResourceName);
if (resourceStream == null)
throw new Exception(string.Format("Unable to find font '{0}' in embedded resources.", fontResourceName));
var fontBytes = new byte[resourceStream.Length];
resourceStream.Read(fontBytes, 0, (int)resourceStream.Length);
resourceStream.Close();
return fontBytes;
}
答案 3 :(得分:0)
这里有一个非常好的帖子,正是你需要的。 将ttf字体嵌入到您的应用程序中,请考虑您嵌入的内容及其许可证。