Пользовательские шрифты .ttf для использования в C # windows.Form - PullRequest
11 голосов
/ 13 февраля 2009

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

Ответы [ 3 ]

13 голосов
/ 13 февраля 2009

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

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

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

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

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

Figure 1. The Alpha Dance font file embedded in the solution.

Как только файл был успешно включен в нужные вам ресурсы предоставить объект PrivateFontCollection, в котором его хранить и метод, с помощью которого он загружается в коллекцию. Лучшее место, чтобы сделать это, вероятно, переопределение загрузки формы или обработчик события. следующий список показывает процесс. Обратите внимание, как метод AddMemoryFont используется. Требуется указатель на память, в которой находится шрифт сохраняется как массив байтов. В C # мы можем использовать ключевое слово unsafe для удобство, но VB должен использовать возможности классов маршала неуправляемая обработка памяти. Последний вариант, конечно, открыт для C # программисты, которым просто не нравится ключевое слово 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 показано приложение в действии.

Figure 2. The embedded Alpha Dance font.

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

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

3 голосов
/ 16 апреля 2012

Может оказаться полезной статья MSDN Как: создать личную коллекцию шрифтов .

3 голосов
/ 13 февраля 2009

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

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

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