Ответ 1
Эта статья: Как вставить шрифт истинного типа показывает, как делать то, что вы просите в .NET.
Как встроить шрифт True Type
Некоторые приложения по причинам эстетики или требуемого визуального стиль, встроят некоторые необычные шрифты, чтобы они всегда были там при необходимости, независимо от того, установлен ли шрифт на системы назначения.
Секрет этого двоякого. Сначала шрифт должен быть помещен в ресурсов, добавив его в решение и отметив его как встроенный ресурс. Во-вторых, во время выполнения шрифт загружается через поток и сохраняется в объекте PrivateFontCollection для последующего использования.В этом примере используется шрифт, который вряд ли будет установлен на вашем система. Alpha Dance - бесплатный шрифт True Type, доступный из Коллекция бесплатных шрифтов. Этот шрифт был встроен в приложение добавив его в решение и выбрав "встроенный ресурс", построить действие в свойствах.
Как только файл будет успешно включен в нужные вам ресурсы для предоставления объекта PrivateFontCollection, в котором его хранить и метод, с помощью которого он загружается в коллекцию. Лучшее место для отдыха это, вероятно, переопределение формы или обработчик событий. следующий листинг показывает процесс. Обратите внимание, как метод AddMemoryFont используется. Для этого требуется указатель на память, в которой шрифт сохраняется как массив байтов. В С# мы можем использовать ключевое слово unsafe для convienience, но VB должен использовать возможности классов маршала управление неуправляемой памятью. Последний вариант, конечно, открыт для С# программисты, которым просто не нравится ключевое слово unsafe. PrivateFontCollection pfc = new PrivateFontCollection();
private void Form1_Load(object sender, System.EventArgs e)
{
Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("embedfont.Alphd___.ttf");
byte[] fontdata = new byte[fontStream.Length];
fontStream.Read(fontdata,0,(int)fontStream.Length);
fontStream.Close();
unsafe
{
fixed(byte * pFontData = fontdata)
{
pfc.AddMemoryFont((System.IntPtr)pFontData,fontdata.Length);
}
}
}
Шрифты могут иметь только определенные стили, которые доступны и к сожалению, выбор стиля шрифта, который не существует, приведет к исключение. Чтобы преодолеть это, можно опросить шрифт, чтобы увидеть, какие стили доступны, и могут использоваться только те, которые предоставляются шрифтом. В следующем листинге показано, как шрифт Alpha Dance используется проверка доступных стилей шрифтов и отображение всех существующих. Обратите внимание, что стили подчеркивания и зачеркивания являются псевдоспирами построенные механизмом рендеринга шрифтов и фактически не предоставляются в форме глифа.
private void Form1_Paint(object sender, System.Windows.Forms.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();
}
На рисунке 2 показано приложение в действии.
См. обработчик события Form1_Paint, он показывает, как установить тип System.Drawing.Font. Он основан на использовании класса System.Drawing.Text.PrivateFontCollection.
Надеюсь, что это поможет.