Ответ 1
Это сообщение должно помочь вам.
В основном вы добавляете шрифт в качестве встроенного ресурса, а затем загружаете его в объект PrivateFontCollection.
Каков наилучший способ вставки шрифта truetype в приложение, которое я разрабатываю? В основном я хочу убедиться, что конкретный шрифт доступен для моего приложения, когда он установлен на другой машине. У меня есть файл шрифта *.ttf и вам просто нужен способ его встраивания или автоматической установки при запуске приложения.
Нужно ли устанавливать программу установки для установки шрифта во время установки или я могу динамически загружать шрифт во время выполнения приложения? На самом деле оба будут приятно знать.
Приложение разрабатывается на С# с использованием .NET 2.0.
Это сообщение должно помочь вам.
В основном вы добавляете шрифт в качестве встроенного ресурса, а затем загружаете его в объект PrivateFontCollection.
Вот ответ, переведённый на С# (непроверенный):
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);
}
}
}
}
Его легче, чем кажется; вы можете вставлять шрифт в качестве ресурса в ваше приложение и обращаться к нему как к строго типизированному свойству в пространстве имен 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 +.
это может быть не лучший способ, но не могли бы вы просто включить шрифт с вашими ресурсами, а затем скопировать его в папку шрифтов в каталоге dir?