Используйте шрифт ресурса непосредственно в VB.net/C#

Как использовать шрифт ресурса непосредственно, не сохраняя шрифт в локальной файловой системе для автономного приложения [настольное приложение] в VB.net/C#?

8
задан SamSol 28 May 2010 в 11:38
поделиться

2 ответа

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

15
ответ дан 5 December 2019 в 10:39
поделиться

Вы говорите об упаковке шрифтов с приложением. если да. посмотрите это: http://msdn.microsoft.com/en-us/library/ms753303.aspx

1
ответ дан 5 December 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: