Использовать проблему нестандартного шрифта - PullRequest
1 голос
/ 20 марта 2012

У меня есть файл нестандартного шрифта, который я хочу использовать в своем приложении, в настоящее время я использую .net framework2, и вот код, который я использовал:

private void Form1_Load(object sender, EventArgs e)
{
    //load the resource
    Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("Eurostile_Regular_0.ttf");

    //create an unsafe memory block for the data
    System.IntPtr data = Marshal.AllocCoTaskMem(Convert.ToInt16(fontStream.Length));

    //create a buffer to read in to
    byte[] fontdata = null;
    fontdata = new byte[fontStream.Length + 1];

    //fetch the font program from the resource
    fontStream.Read(fontdata, 0, Convert.ToInt16(fontStream.Length));

    //copy the bytes to the unsafe memory block
    Marshal.Copy(fontdata, 0, data, Convert.ToInt16(fontStream.Length));

    //pass the font to the font collection
    pfc.AddMemoryFont(data, Convert.ToInt16(fontStream.Length));

    //close the resource stream
    fontStream.Close();

    //free the unsafe memory
    Marshal.FreeCoTaskMem(data);
}

И на Form1_Paint:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    bool bold = false;
    bool regular = false;
    bool italic = false;

    e.Graphics.PageUnit = GraphicsUnit.Point;

    SolidBrush b = new SolidBrush(Color.Black);

    float y = 5;

    System.Drawing.Font fn;

    foreach (FontFamily ff in pfc.Families)
    {
        if (ff.IsStyleAvailable(FontStyle.Regular))
        {
            regular = true;
            fn = new Font(ff, 18, FontStyle.Regular);
            e.Graphics.DrawString(fn.Name, fn, b, 5, y, StringFormat.GenericTypographic);
            fn.Dispose();
            y += 20;
        }

        if (ff.IsStyleAvailable(FontStyle.Bold))
        {
            bold = true;
            fn = new Font(ff, 18, FontStyle.Bold);
            e.Graphics.DrawString(fn.Name, fn, b, 5, y, StringFormat.GenericTypographic);
            fn.Dispose();
            y += 20;
        }

        if (ff.IsStyleAvailable(FontStyle.Italic))
        {
            italic = true;
            fn = new Font(ff, 18, FontStyle.Italic);
            e.Graphics.DrawString(fn.Name, fn, b, 5, y, StringFormat.GenericTypographic);
            fn.Dispose();
            y += 20;
        }

        if (bold && italic)
        {
            fn = new Font(ff, 18, FontStyle.Bold | FontStyle.Italic);
            e.Graphics.DrawString(fn.Name, fn, b, 5, y, StringFormat.GenericTypographic);
            fn.Dispose();
            y += 20;
        }
        fn = new Font(ff, 18, FontStyle.Underline);
        e.Graphics.DrawString(fn.Name, fn, b, 5, y, StringFormat.GenericTypographic);
        fn.Dispose();
        y += 20;
        fn = new Font(ff, 18, FontStyle.Strikeout);
        e.Graphics.DrawString(fn.Name, fn, b, 5, y, StringFormat.GenericTypographic);
        fn.Dispose();
    }
    b.Dispose();
}

Но шрифт не работает, и я получаю ошибку JIT из второй строки в form_load

System.NullReferenceException: Ссылка на объект не установлена ​​на экземпляр объекта.

Ответы [ 2 ]

1 голос
/ 20 февраля 2014

Сначала перейдите на Font Properties -> Build Action -> "Embedded Resource"

Во-вторых, ваша проблема в том, что вы забыли добавить имя NameSpace в коде

Неверный формат

Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("FileName.ttf");

Правильный формат

Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("NameSpaceName.FileName.ttf");

Удачи

0 голосов
/ 13 августа 2012

fontStream имеет значение null, поскольку GetManifestResourceStream не может найти ваш шрифт.Ваш шрифт должен быть добавлен в решение, а затем выбрать «встроенный ресурс» в свойствах в процессе сборки.Похоже, вы пытались встроить шрифт, но неправильно назвали его в запросе потока.Добавление вашей коллекции ресурсов проекта:

Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("yourApp.Eurostile_Regular_0.ttf");

Дополнительную информацию можно получить здесь: Как встроить шрифт True Type

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...