Как мне встроить шрифт в мое приложение C #? (с использованием Visual Studio 2005) - PullRequest
16 голосов
/ 07 апреля 2009

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

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

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

Ответы [ 4 ]

15 голосов
/ 07 апреля 2009

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

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

12 голосов
/ 07 апреля 2009

Вот ответ Уилла, переведенный на C # (не проверено):

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);
            }
        }
    }
}
11 голосов
/ 07 апреля 2009

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


Для VB-инвалидов:

Добавьте шрифт в качестве ресурса в ваше приложение. Вызовите ресурс 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 + рендеринг в приложении или на отдельные элементы управления, установив элемент управления UseCompatibleTextRendering свойство к истине. Некоторые элементы управления не могут рендериться с помощью GDI +.

0 голосов
/ 08 апреля 2009

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

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