在 VB.net/C# 中直接使用资源字体

Posted

技术标签:

【中文标题】在 VB.net/C# 中直接使用资源字体【英文标题】:Use resource font directly in VB.net/C# 【发布时间】:2013-03-08 15:12:30 【问题描述】:

如何在VB.net/C#中为独立应用[桌面应用]直接使用资源字体而不在本地文件系统中保存字体?

【问题讨论】:

@SamSol:没有 CS.NET 这样的东西。你从哪里听说过这个?该语言只是“C#”。 【参考方案1】:

这是可能的,您需要使用 PrivateFontCollection.AddMemoryFont() 方法。例如,我添加了一个名为“test.ttf”的字体文件作为资源并像这样使用它:

using System.Drawing.Text;
using System.Runtime.InteropServices;
...
public partial class Form1 : Form 
    private static PrivateFontCollection myFonts;
    private static IntPtr fontBuffer;

    public Form1() 
        InitializeComponent();
        if (myFonts == null) 
            myFonts = new PrivateFontCollection();
            byte[] font = Properties.Resources.test;
            fontBuffer = Marshal.AllocCoTaskMem(font.Length);
            Marshal.Copy(font, 0, fontBuffer, font.Length);
            myFonts.AddMemoryFont(fontBuffer, font.Length);
        
    

    protected override void OnPaint(PaintEventArgs e) 
        FontFamily fam = myFonts.Families[0];
        using (Font fnt = new Font(fam, 16)) 
            TextRenderer.DrawText(e.Graphics, "Private font", fnt, Point.Empty, Color.Black);
            //e.Graphics.DrawString("Private font", fnt, Brushes.Black, 0, 0);
        
    

请注意fontBuffer 变量是有意静态的。使用 AddMemoryFont() 时内存管理很困难,只要字体可以使用且 PrivateFontCollection 尚未释放,内存就需要保持有效。如果您没有该保证,请务必不要调用 Marshal.FreeCoTaskMem(),这是一个非常常见的错误,导致很难诊断文本损坏。只有在幸运时才会收到 AccessViolationException。简单的解决方案是让它在程序的生命周期内保持有效。

【讨论】:

@HansPassant : 如果我要添加的字体文​​件具有 '.bin' 扩展名而不是 '.ttf' 怎么办 我需要在工作之前使用 PInvoke。必须使用函数AddFontMemResourceEx...也许是因为PrivateFontCollection.AddMemoryFont() 期望字体在系统内存中。我还想知道这是否与我正在更改文本框的字体这一事实有关,而不是与字体显式渲染有关。 (但使用 PrivateFontCollection.AddFontFile() 在没有 PInvoke 功能的情况下仍然有效)。【参考方案2】:

您是在谈论使用应用程序包装字体吗?如是。 看看这个: http://msdn.microsoft.com/en-us/library/ms753303.aspx

【讨论】:

以上是关于在 VB.net/C# 中直接使用资源字体的主要内容,如果未能解决你的问题,请参考以下文章

在WPF中使用FontAwesome之类的字体图标

如何在 Xamarin Forms 中使用自定义字体(任何外部字体)作为嵌入资源?

从字体资源 ID 创建字体

Font Awesome矢量版,十六进制版,WPF字体使用

iconfont字体图标的使用

如何更改解决方案资源管理器的字体大小(在 Visual Studio 中)