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

Свойства и методы класса Font

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


Свойства класса Font



Тип Свойство Доступ Описание

string Name Чтение Название гарнитуры
FontFamily FontFamily Чтение Класс гарнитуры
FontStyle Style Чтение Из конструктора
bool Bold Чтение Истина, если полужирное начертание
bool Italic Чтение Истина, если курсивное начертание
bool Underline Чтение Истина, если с подчеркиванием
bool Strikeout Чтение Истина, если с зачеркиванием
float Size Чтение Из конструктора
GraphicsUnit Unit Чтение Из конструктора
float SizeInPoints Чтение Вычисляется из Size
int Height Чтение Межстрочный интервал для монитора
byte GdiCharSet Чтение Код набора знаков GDI
bool GdiVerticalFont Чтение Истина, если шрифт вертикальный


Свойства Size и Unit просто возвращают величины, использованные при создании шрифта. Свойство SizeInPoints вычисляется на основании этих величин. При использовании GraphicsUnit.Pixel и GraphicsUnit.World вычисления основаны на разрешении монитора.

Если нет необходимости иметь дело с Win32 API, представляет интерес только один метод класса Font, на который я уже обращал ваше внимание. Этот метод имеет три версии:


Методы Font (выборочно)



float GetHeight()
float GetHeight(Graphics grfx)
float GetHeight(float fDpi)


Величина, возвращаемая методом GetHeight, используется для последовательного размещения строчек текста. Версия метода без аргументов применяется только для вывода на монитор и для преобразования страницы по умолчанию. Вторая, наиболее полезная версия принимает во внимание разрешение и преобразование страницы для выходного устройства. Третья позволяет получить межстрочный интервал на основе гипотетического вертикального разрешения в точках на дюйм.

Если нужно использовать Win32 API, класс Font предлагает три статических метода, которые позволяют создать объект Font: FromHdc, FromHfont и FromLogFont. С другой стороны, класс Font не может создать объект Font иначе, как используя один из конструкторов класса. Мы уже обсудили пять из этих конструкторов, еще о четырех речь пойдет ниже. Как я покажу в главе 16, класс FontDialog создает диалоговое окно, в котором пользователь может выбрать шрифт, и создает объект Font, который могут задействовать приложения.

Ниже приведена программа, которая показывает все свойства объекта Font формы, a также результат работы трех версий GetHeight (третья из которых использует разрешение 100 dpi).

AllAboutFont.cs

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

  class AllAboutFont: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new AllAboutFont());
      }
      public AllAboutFont()
      {
          Text = "All About Font";
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          grfx.DrawString(
                    "Name: "               + Font.Name            + "\n" +
                    "FontFamily: "         + Font.FontFamily      + "\n" +
                    "FontStyle: "          + Font.Style           + "\n" +
                    "Bold: "               + Font.Bold            + "\n" +
                    "Italic: "             + Font.Italic          + "\n" +
                    "Underline: "          + Font.Underline       + "\n" +
                    "Strikeout: "          + Font.Strikeout       + "\n" +
                    "Size: "               + Font.Size            + "\n" +
                    "GraphicsUnit: "       + Font.Unit            + "\n" +
                    "SizeInPoints: "       + Font.SizeInPoints    + "\n" +
                    "Height: "             + Font.Height          + "\n" +
                    "GdiCharSet: "         + Font.GdiCharSet      + "\n" +
                    "GdiVerticalFont: "    + Font.GdiVerticalFont + "\n" +
                    "GetHeight(): "        + Font.GetHeight()     + "\n" +
                    "GetHeight(grfx): "    + Font.GetHeight(grfx) + "\n" +
                    "GetHeight(100 DPI): " + Font.GetHeight(100),
                    Font, new SolidBrush(clr), Point.Empty);
      }
  }

Щелкните по клиентской области этой программы, чтобы вывести результат на печать. Распечатка будет выглядеть так же, как экранный вид, за исключением предпоследней величины GetHeight, для которой результат на распечатке будет совпадать с последней величиной. Вы можете посмотреть на свойства других шрифтов, присвоив свойству Font формы интересующий вас шрифт. Вот как выглядит программа на моем компьютере:


Рис. 9.5.

Мой монитор настроен на большие шрифты, подразумевающие разрешение 120 dpi. Межстрочный интервал в 14,71 пиксела соответствует примерно 0,123 дюйма или около 9 пт. Это подходящий межстрочный интервал для 8-пунктного шрифта. Если на компьютере установлены маленькие шрифты (подразумевается разрешение 96 dpi), величина межстрочного интервала будет равна 12,45, а свойство Height даст величину 13.

Первый из рассмотренных нами конструкторов класса Font создает новый шрифт на основе существующего, но с другим стилем. Иногда необходимо создать текст с тем же стилем, но другого размера.

Допустим, нужно создать текст, который впишется в заданный прямоугольник. Начнем с того, что выберем шрифт и введем текст. Используем метод MeasureString, чтобы определить размеры строки, а затем создадим новый шрифт с размерами, подогнанными к размеру прямоугольника. Следующая программа выводит на монитор текст «Howdy, world!» (вариация традиционного текста, включающая нижний выносной элемент). Текст масштабируется до максимальных размеров, вписывающихся в клиентскую область.

HowdyWorld.cs

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

  class HowdyWorld: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new HowdyWorld());
      }
      public HowdyWorld()
      {
          Text = "Howdy, world!";
          MinimumSize = SystemInformation.MinimumWindowSize + new Size(0,1);
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          Font  font   = new Font("Times New Roman", 10, FontStyle.Italic);
          SizeF sizef  = grfx.MeasureString(Text, font);
          float fScale = Math.Min(cx / sizef.Width, cy / sizef.Height);

          font = new Font(font.Name, fScale * font.SizeInPoints, font.Style);
          sizef = grfx.MeasureString(Text, font);

          grfx.DrawString(Text, font, new SolidBrush(clr), 
                          (cx  - sizef.Width ) / 2, (cy - sizef.Height) / 2);
      }
  }

Инициализация свойства MinimumSize в конструкторе предотвращает «схлопывание» клиентской области, которое привело бы к нулевому размеру шрифта и сообщению об ошибке.

Метод DoPage начинает свою работу с создания объекта Font, но используемый им шрифт может быть свойством формы Font или шрифтом, созданным в другом месте программы. Смысл в том, что программе не нужно знать, какие аргументы были изначально использованы для создания шрифта.

Следующая инструкция в DoPage использует MeasureString, чтобы найти длину строки (которая задана как свойство Text формы) для шрифта, который мы только что создали. Третий оператор вычисляет коэффициент масштабирования на основе соотношения размера клиентской области (или области печати страницы принтера) и размера текста. Заметьте: метод Math.Min нужен для того, чтобы выбрать минимальный из вертикального и горизонтального коэффициентов масштабирования.

Далее, метод DoPage создает новый шрифт на основе существующего шрифта, но масштабирует кегль с коэффициентом fScale. Затем вновь вызывается метод MeasureString (или умножается Width и Height предыдущего объекта SizeF на fScale). И, наконец, строка помещается в центре клиентской области.


Рис. 9.6.

Если окно слишком широкое, размер шрифта подгоняется к высоте окна:


Рис. 9.7.

Можно ли создать шрифт, заполняющий текстом прямоугольную область с любым соотношением длины и высоты? Пусть при этом знаки будут искажены и их ширина или высота станет меньше или больше обычной. Конструктор Font тут бессилен. В конструкторах Font вы задаете высоту шрифта, а ширина определяется на основании высоты.

Изменить пропорцию знаков текста позволяет мировое преобразование. Вот вариант программы HowdyWorld, который демонстрирует это.

HowdyWorldFullFit.cs

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

  class HowdyWorldFullFit: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new HowdyWorldFullFit());
      }
      public HowdyWorldFullFit()
      {
          Text = "Howdy, world!";
          MinimumSize = SystemInformation.MinimumWindowSize + new Size(0,1);
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          Font  font  = new Font("Times New Roman", 10, FontStyle.Italic);
          SizeF sizef = grfx.MeasureString(Text, font);
          float fScaleHorz = cx / sizef.Width;
          float fScaleVert = cy / sizef.Height;

          grfx.ScaleTransform(fScaleHorz, fScaleVert);

          grfx.DrawString(Text, font, new SolidBrush(clr), 0, 0);
      }
  }

В этом варианте коэффициенты масштабирования по горизонтали и по вертикали вычисляются раздельно. Эти коэффициенты передаются непосредственно методу ScaleTransform. Метод DrawString выводит на монитор текст с началом в точке (0, 0):


Рис. 9.8.

Как обычно, вы можете вывести результат работы программы на печать. Вы увидите знаки, растянутые почти по всей высоте страницы.

Обратите внимание, что на этом рисунке (как и на втором рисунке к первой программе HowdyWorld) высота текста меньше полной высоты клиентской области. Пустое место над верхними выносными элементами зарезервировано в основном для диакритических знаков. Если бы в тексте были буквы À, Á или Â ('\x00C0', '\х00C1 и '\x00C2' в кодировке Unicode), диакритические знаки достигли бы верха клиентской области.

Если используются библиотеки Windows Forms, приложение не может определить, сколько места оставить для диакритических знаков. Не может оно определить и высоту строчного знака без выносных элементов над линией шрифта (x-высоту). Эти специфические, так называемые шрифтовые метрики (font metrics) не представлены в библиотеках Windows Forms. Как я покажу далее, некоторые шрифтовые метрики можно вывести из имеющихся. Если вам это действительно нужно, можете приблизительно определить х-высоту, используя графические контуры (о них поговорим в главе 15).


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

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