将ttf嵌入为嵌入式资源:无法引用它

时间:2010-03-28 22:58:56

标签: c# resources true-type-fonts

我刚刚将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以使用新字体?

4 个答案:

答案 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字体嵌入到您的应用程序中,请考虑您嵌入的内容及其许可证。

How to Add ttf to your C# project as and embedded resource