加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-17 00:04:35 所属栏目:大数据 来源:网络整理
导读:如何直接使用资源字体而不在VB.net/C#中为独立应用程序[桌面应用程序]保存本地文件系统中的字体? 这是可能的,你需要使用PrivateFontCollection.AddMemoryFont()方法.例如,我添加了一个名为“test.ttf”的字体文件作为资源,并使用它如下: using System.Draw
如何直接使用资源字体而不在VB.net/C#中为独立应用程序[桌面应用程序]保存本地文件系统中的字体?
这是可能的,你需要使用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,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",Brushes.Black,0);
        }
    }
}

请注意,fontBuffer变量是故意静态的.使用AddMemoryFont()时内存管理很困难,只要可以使用字体并且尚未处理PrivateFontCollection,内存需要保持有效.如果你没有这个保证,一定不要调用Marshal.FreeCoTaskMem(),这是一个非常常见的错误,导致很难诊断文本损坏.幸运的话,你只会得到一个AccessViolationException.保持它对程序的生命有效是一个简单的解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读