Пользовательские шрифты .ttf для использования в С# windows.Form

Как использовать собственный файл шрифта .tff, который у меня есть с моим текущим приложением windows.forms? Я прочитал некоторые, где я использую его как встроенный ресурс, но как установить его тип System.Drawing.Font?

Ответ 1

Эта статья: Как вставить шрифт истинного типа показывает, как делать то, что вы просите в .NET.

Как встроить шрифт True Type

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

Секрет этого двоякого. Сначала шрифт должен быть помещен в ресурсов, добавив его в решение и отметив его как встроенный ресурс. Во-вторых, во время выполнения шрифт загружается через поток и сохраняется в объекте PrivateFontCollection для последующего использования.

В этом примере используется шрифт, который вряд ли будет установлен на вашем система. Alpha Dance - бесплатный шрифт True Type, доступный из Коллекция бесплатных шрифтов. Этот шрифт был встроен в приложение добавив его в решение и выбрав "встроенный ресурс", построить действие в свойствах.

Рисунок 1. Файл шрифта Alpha Dance, встроенный в решение.

Как только файл будет успешно включен в нужные вам ресурсы для предоставления объекта 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 показано приложение в действии.

Рисунок 2. Встроенный шрифт Alpha Dance.

См. обработчик события Form1_Paint, он показывает, как установить тип System.Drawing.Font. Он основан на использовании класса System.Drawing.Text.PrivateFontCollection.

Надеюсь, что это поможет.

Ответ 2

Используйте AddFontResourceEx через функцию p/invoke, передав FR_PRIVATE, чтобы предотвратить установку глобального шрифта. Затем вы должны иметь возможность передать имя шрифта конструктору Font, как обычно.

Изменить: если вы используете PrivateFontCollection и загружаете шрифт из внешнего файла, вам это даже не нужно. Если вы загружаете шрифт из встроенного ресурса, используйте решение Ash.