Это возможно, вам нужно использовать метод 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 только тогда, когда вам повезет. Поддержание его в течение всей жизни программы - простое решение.