Как вставить шрифт с помощью моего приложения на С#? (с использованием Visual Studio 2005)

Каков наилучший способ вставки шрифта truetype в приложение, которое я разрабатываю? В основном я хочу убедиться, что конкретный шрифт доступен для моего приложения, когда он установлен на другой машине. У меня есть файл шрифта *.ttf и вам просто нужен способ его встраивания или автоматической установки при запуске приложения.

Нужно ли устанавливать программу установки для установки шрифта во время установки или я могу динамически загружать шрифт во время выполнения приложения? На самом деле оба будут приятно знать.

Приложение разрабатывается на С# с использованием .NET 2.0.

Ответы

Ответ 1

Это сообщение должно помочь вам.

В основном вы добавляете шрифт в качестве встроенного ресурса, а затем загружаете его в объект PrivateFontCollection.

Ответ 2

Вот ответ, переведённый на С# (непроверенный):

PrivateFontCollection pfc = new PrivateFontCollection();

using (Stream fontStream = GetType().Assembly.GetManifestResourceStream("Alphd___.ttf"))
{
    if (null == fontStream)
    {
        return;
    }

    int fontStreamLength = (int) fontStream.Length;

    IntPtr data = Marshal.AllocCoTaskMem(fontStreamLength);

    byte[] fontData = new byte[fontStreamLength];
    fontStream.Read(fontData, 0, fontStreamLength);

    Marshal.Copy(fontData, 0, data, fontStreamLength);

    pfc.AddMemoryFont(data, fontStreamLength);

    Marshal.FreeCoTaskMem(data);
}

вместе с методом Paint():

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

    e.Graphics.PageUnit = GraphicsUnit.Point;

    using (SolidBrush b = new SolidBrush(Color.Black))
    {
        int y = 5;

        foreach (FontFamily fontFamily in pfc.Families)
        {
            if (fontFamily.IsStyleAvailable(FontStyle.Regular))
            {
                using (Font font = new Font(fontFamily, 32, FontStyle.Regular))
                {
                    e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                }
                y += 40;
            }
            if (fontFamily.IsStyleAvailable(FontStyle.Bold))
            {
                bold = true;
                using (Font font = new Font(fontFamily, 32, FontStyle.Bold))
                {
                    e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                }
                y += 40;
            }
            if (fontFamily.IsStyleAvailable(FontStyle.Italic))
            {
                italic = true;
                using (Font font = new Font(fontFamily, 32, FontStyle.Italic))
                {
                    e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                }
                y += 40;
            }

            if(bold && italic)
            {
                using(Font font = new Font(fontFamily, 32, FontStyle.Bold | FontStyle.Italic))
                {
                    e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                }
                y += 40;
            }

            using (Font font = new Font(fontFamily, 32, FontStyle.Underline))
            {
                e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                y += 40;
            }

            using (Font font = new Font(fontFamily, 32, FontStyle.Strikeout))
            {
                e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
            }
        }
    }
}

Ответ 3

Его легче, чем кажется; вы можете вставлять шрифт в качестве ресурса в ваше приложение и обращаться к нему как к строго типизированному свойству в пространстве имен Properties вашего приложения. Но данная ссылка должна быть хорошей отправной точкой.


Для VB-disabled:

Добавить шрифт в качестве ресурса в вашем приложении. Вызовите ресурс MyFontLol. Вы можете получить доступ к этому ресурсу (в виде байтового массива) из Properties.Resources.MyFontLol.

Я не тестировал следующее, но он выглядит работоспособным:

public void LoadMyFontLolKThx()
{
    // get our font and wrap it in a memory stream
    byte[] myFont = Properties.Resources.MyFontLol;
    using (var ms = new MemoryStream(myFont))
    {
        // used to store our font and make it available in our app
        PrivateFontCollection pfc = new PrivateFontCollection();
        // The next call requires a pointer to our memory font
        // I'm doing it this way; not sure what best practice is
        GCHandle handle = GCHandle.Alloc(ms, GCHandleType.Pinned);
        // If Length > int.MaxValue this will throw
        checked
        {
            pfc.AddMemoryFont(
                handle.AddrOfPinnedObject(), (int)ms.Length); 
        }
        var font = new Font(pfc.Families[0],12);

        // use your font here
    }
}

Одна последняя заметка. PFC сохраняет шрифт как шрифт GDI+. Они не совместимы с элементами управления некоторыми формами. Из документов:

Чтобы использовать шрифт памяти, текст на управление должно быть выполнено с помощью GDI+. Использовать SetCompatibleTextRenderingDefaultметод, передавая true, установить GDI + рендеринг в приложении или на отдельных элементов управления, установив control UseCompatibleTextRenderingсвойство true. Некоторые элементы управления не могут с помощью GDI +.

Ответ 4

это может быть не лучший способ, но не могли бы вы просто включить шрифт с вашими ресурсами, а затем скопировать его в папку шрифтов в каталоге dir?