Пользовательские .ttf шрифты для использования в окнах C#. Форма

Вопрос в том, знаете ли вы тип элементов в вашей вершине в то время, когда вы хотите провести сравнение.

то есть. этот код действителен из-за стирания типа:

Vertex<String> strVtx = ...
Vertex<Integer> intVtx = ...
List<Vertex> list = Arrays.asList(strVtx, intVtx);
list.sort(aComparer);

Так что реализация компаратора здесь должна быть ненадежной.

Однако, если вы знаете тип, который вы можете просто сделать:

List<Vertex<Integer>> list = ...
list.sort(Comparator.comparing(Vertex::getElement);
11
задан kthakore 13 February 2009 в 03:15
поделиться

2 ответа

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

Как встроить Истинный Печатный шрифт

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

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

Этот пример использует шрифт, который вряд ли будет установлен в Вашей системе. Альфа-Танец является свободным Истинным Печатным шрифтом, который доступен от Свободного Набора Шрифтов. Этот шрифт был встроен в приложение путем добавления его к решению и выбора "встроенного ресурса" действие сборки в свойствах.

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

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

Шрифты могут иметь только определенные стили, которые доступны и к сожалению, выбирая стиль шрифта, который не существует, выдаст исключение. Для преодоления этого, шрифт может быть опрошен для наблюдения, какие стили доступны, и только обеспеченные шрифтом могут использоваться. Следующий список демонстрирует, как Альфа-шрифт Танца используется путем проверки доступных стилей шрифтов и показа всех те, которые существуют. Обратите внимание, что подчеркивание и перечеркнутые стили являются псевдо стилями, созданными механизмом визуализации шрифта, и на самом деле не обеспечиваются в форме глифа.

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, он показывает конкретно, как установить Систему. Рисование. Тип шрифта. Это основано на использовании Системы. Рисование. Текст. Класс PrivateFontCollection.

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

13
ответ дан 3 December 2019 в 06:23
поделиться

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

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

3
ответ дан 3 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: