netlib.narod.ru< Назад | Оглавление | Далее >

Создание шрифта по названию

Следующий набор конструкторов класса Font очень удобен: вы определяете шрифт, выбирая гарнитуру, кегль и, если требуется, начертание:


Конструкторы Font (выборочно)



Font(string strFamily, float fSizeInPoints)
Font(string strFamily, float fSizeInPoints, FontStyle fs)


Название гарнитуры, которое вы указываете как первый аргумент конструктора Font, — это хорошо известные вам названия Times New Roman, Arial, Courier New, Comic Sans MS и т.д. Вот как можно создать шрифт Times New Roman hразмером 24 пункта:

  Font font = new Font("Times New Roman", 24);

Мне нравится такой способ создания шрифтов, думаю, и вы будете отдавать предпочтение этим конструкторам Font. Однако у них есть и недостатки.

Используемая гарнитура должна быть типа TrueType или OpenType и установлена на компьютере, где запускается программа. Если шрифта Times New Roman нет или вы неправильно набрали его название, конструктор заменит его на шрифт, используемый по умолчанию (скорее всего на Microsoft Sans Serif). Вы уверены, что шрифт Times New Roman доступен? Скорее всего да, если вы пишете программу для себя. Опять же да, если программа предназначена для внутреннего использования в вашей компании и вы уверены, что на всех рабочих станциях установлен Times New Roman. Но вполне может случиться так (как это ни странно может звучать), что пользователи его удалили. Так как вы стремитесь к тому, чтобы ваш код как можно меньше зависел от платформы, явное использование названий гарнитур — решение ненадежное. Возможно, в будущем программы Windows Forms будут работать в другой среде, с другими наборами шрифтов. И, хотя скорее всего в такой среде будет установлено какое-то соответствие между новыми и старыми шрифтами, обеспечивающее корректную работу существующих программ, риск при использовании малоизвестных гарнитур остается.

Чтобы избежать проблем в будущем, лучше всего ограничиться тремя гарнитурами: Times New Roman, Arial и Courier New. Допустимо использовать некоторые псевдонимы, например, Times для Times New Roman и Helvetica для Arial.

Явное указание кегля не влечет за собой таких проблем. Вы знаете, что пользователь настраивает дисплей, исходя из того, что удобен шрифт размером 10 пунктов. Windows Forms устанавливают свойство Font исходя из предположения, что 8-пунктный шрифт также читабелен. Все остальное7nbsp;— относительно. Например, 24-пунктный шрифт втрое больше, чем нормальный шрифт Windows Forms.

Так как в одном дюйме содержится 72 пт, 24-пунктный шрифт имеет высоту приблизительно 1/3 дюйма. (Приблизительно, потому что, как я упоминал ранее, кегль — это понятие из области шрифтового дизайна, а не точная величина.) Можно считать, что в пикселах 24-пунктный шрифт имеет размер, равный примерно 1/3 величины свойства DpiY объекта Graphics.

Название гарнитуры и кегль также могут комбинироваться с начертанием шрифта. Следующая программа создает и отображает на экране 18-пунктные шрифты Courier New, Arial и Times New Roman в нормальном, полужирном, курсивном и полужирном курсивном начертаниях. Они имеют размер приблизительно 1/4 дюйма.

FontNames.cs

  //------------------------------------------
  // FontNames.cs (C) 2001 by Charles Petzold
  //------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class FontNames: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new FontNames());
      }
      public FontNames()
      {
          Text = "Font Names";
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          string[]    astrFonts = { "Courier New", "Arial",
                                    "Times New Roman" };
          FontStyle[] afs       = { FontStyle.Regular, FontStyle.Bold,
                                    FontStyle.Italic,
                                    FontStyle.Bold | FontStyle.Italic };
          Brush       brush     = new SolidBrush(clr);
          float       y         = 0;

          foreach (string strFont in astrFonts)
          {
              foreach (FontStyle fs in afs)
              {
                  Font font = new Font(strFont, 18, fs);
                  grfx.DrawString(strFont, font, brush, 0, y);
                  y += font.GetHeight(grfx);
              }
          }
      }
  }

Этот класс наследуется от PrintableForm, поэтому вы можете вывести шрифты на печать, щелкнув по клиентской области программы. Помните, что координаты, передаваемые методу DrawString, указывают на положение верхнего левого угла строки. Следовательно, координаты каждой строки должны быть заданы с учетом высоты предыдущей строки. Программа корректирует эти координаты, добавляя величину, возвращаемую методом GetHeight свойства Font после вывода строки текста с соответствующим шрифтом.

Для разных шрифтов метод GetHeight возвращает разные значения. Добавьте вызов Console.WriteLine, если вам интересно их сравнить. Вы увидите, что Times New Roman и Arial дают одинаковую величину, немного большую, чем Courier New. Для других шрифтов все может быть иначе, поэтому не пытайтесь угадать, а используйте метод GetHeight. Вот что программа выведет на экран:


Рис. 9.2.

Вы можете попробовать заменить свойство Height на метод GetHeight и посмотреть, что получится при выводе результата на принтер. Межстрочный интервал уменьшится на величину, которая зависит от того, насколько разрешение монитора, измеряемое в точках на дюйм (dpi), отличается от разрешения 100 dpi, установленного для принтера.

Вот листинг аналогичной программы, которая выводит на монитор шрифт Times New Roman с размерами от 6 до 12 пт с приращением в 1/4 пт.

FontSizes.cs

  //------------------------------------------
  // FontSizes.cs (C) 2001 by Charles Petzold
  //------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class FontSizes: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new FontSizes());
      }
      public FontSizes()
      {
          Text = "Font Sizes";
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {    
          string strFont = "Times New Roman";
          Brush  brush   = new SolidBrush(clr);
          float  y       = 0;

          for (float fSize = 6; fSize <= 12; fSize += 0.25f)
          {
              Font font = new Font(strFont, fSize);
              grfx.DrawString(strFont + " in " + fSize + " points", 
                              font, brush, 0, y);
              y += font.GetHeight(grfx);
          }
      }
  }

В результате работы программы мы увидим на экране:


Рис. 9.3.

Пожалуй, самое примечательное на этом изображении — неожиданный скачок толщины линий в символах от 1 к 2 пикселам при размере шрифта 10,5 пт. Такие переходы не так заметны при выводе на устройства с более высоким разрешением, например, на принтеры.

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

BoldAndItalicBigger.cs

  //----------------------------------------------------
  // BoldAndItalicBigger.cs (C) 2001 by Charles Petzold
  //----------------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class BoldAndItalicBigger: BoldAndItalic
  {
      public new static void Main()
      {
          Application.Run(new BoldAndItalicBigger());
      }
      public BoldAndItalicBigger()
      {
          Text += " Bigger";
          Font = new Font("Times New Roman", 24);
      }
  }

Вот что программа выведет на экран:


Рис. 9.4.

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


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz