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

Единицы измерения размера шрифта

Не обязательно указывать размер шрифта в пунктах. Следующие два конструктора Font получают в одном из аргументов значение GraphicsUnit:


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



Font(string strFamily, float fSize, GraphicsUnit gu)
Font(string strFamily, float fSize, FontStyle fs, GraphicsUnit gu)


Вы можете использовать любые значения перечисления GraphicsUnit, о которых вы узнали в главе 7 при изучении свойства PageUnit, кроме одного:


Перечисление GraphicsUnit



Член Значение Описание

World 0 В единицах мировых координат
Display 1 Не работает с конструктором Font!
Pixel 2 В пикселах
Point 3 В 1/72 дюйма
Inch 4 В дюймах
Document 5 В 1/300 дюйма
Millimeter 6 В миллиметрах


Конструктор

  new Font(strFamily, float fSize)

идентичен конструктору

  new Font(strFamily, float fSize, GraphicsUnit.Point)

В самом деле, следующие конструкторы эквивалентны:

  new Font(strFamily, 72)
  new Font(strFamily, 72, GraphicsUnit.Point)
  new Font(strFamily, 1, GraphicsUnit.Inch)
  new Font(strFamily, 25.4f, GraphicsUnit.Millimeter)
  new Font(strFamily, 300, GraphicsUnit.Document)

Все эти конструкторы приводят к созданию идентичных 72-пунктных шрифтов. Здесь нет ничего сложного, надо только помнить, что один дюйм равен 72 пт, или 25,4 мм.

Недопустимыми аргументами конструктора Font являются GraphicsUnit.Pixel и GraphicsUnit.World. Если тексты выводятся на монитор и используется преобразование страниц по умолчанию (т.е. все координаты и размеры задаются в пикселах), вы можете использовать такие конструкторы для создания 72-пунктных шрифтов:

  new Font(strFamily, grfx.DpiY, GraphicsUnit.Pixel)
  new Font(strFamily, grfx.DpiY, GraphicsUnit.World)

Второй аргумент — это количество пикселов в одном дюйме по вертикали.

Следующая программа демонстрирует эквивалентность этих двух конструкторов. Она создает 24-пунктные шрифты семью различными способами.

Я использую здесь 24-, а не 72-пунктные шрифты просто потому, что они лучше подходят для отображения на мониторе. В каждом из конструкторов, величина, передаваемая в качестве второго аргумента — это просто 1/3 величины, применявшейся для создания 72-пунктных шрифтов.

TwentyFourPointScreenFonts.cs

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

  class TwentyFourPointScreenFonts: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new TwentyFourPointScreenFonts());
      }
      public TwentyFourPointScreenFonts()
      {
          Text = "Twenty-Four Point Screen Fonts";
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          Brush  brush     = new SolidBrush(clr);
          float  y         = 0;
          Font   font;
          string strFamily = "Times New Roman";

          font = new Font(strFamily, 24);
          grfx.DrawString("No GraphicsUnit, 24 points", font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, 24, GraphicsUnit.Point);
          grfx.DrawString("GraphicsUnit.Point, 24 units", font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, 1/ 3f, GraphicsUnit.Inch);
          grfx.DrawString("GraphicsUnit.Inch, 1/3 units", font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, 25.4f / 3, GraphicsUnit.Millimeter);
          grfx.DrawString("GraphicsUnit.Millimeter, 25.4/3 units", 
                          font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, 100, GraphicsUnit.Document);
          grfx.DrawString("GraphicsUnit.Document, 100 units", 
                          font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, grfx.DpiY / 3, GraphicsUnit.Pixel);
          grfx.DrawString("GraphicsUnit.Pixel, " + grfx.DpiY / 3 + " units",
                          font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, grfx.DpiY / 3, GraphicsUnit.World);
          grfx.DrawString("GraphicsUnit.World, " + grfx.DpiY / 3 + " units", 
                          font, brush, 0, y);
      }
  }

На мониторе все семь строк текста имеют одинаковую высоту. Если вы щелкнете по клиентской области программы для вывода на печать, то столкнетесь с проблемой. Первые пять строк текста будут иметь нормальный вид. Конструкторы успешно создадут 24-пунктные шрифты для принтера. Но шрифт последних двух строк будет слишком большим.

Как вы помните, свойства DpiX и tt>DpiY объекта Graphics дают истинное разрешение принтера: 300, 600, 720 или выше. Для последних двух конструкторов Font в программе задана 1/3 от этой величины, поэтому второй аргумент будет равен 100, 200, 240 или больше. При выводе на печать страница преобразуется по умолчанию так, как если бы выходное устройство имело разрешение 100 dpi. Такое сочетание размеров шрифта и параметров преобразования страницы приводит к тому, что при печати шрифт имеет высоту 1, 2, 2.3 дюйма или еще большую.

Чтобы создать 72-пунктный шрифт для вывода на печать с преобразованием страницы по умолчанию, используя GraphicsUnit.Pixel или GraphicsUnit.World, применяются конструкторы:

  new Font(strFamily, 100, GraphicsUnit.Pixel)
  new Font(strFamily, 100, GraphicsUnit.World)

Чтобы создать 24-пунктный шрифт для вывода на принтер, надо использовать 1/3 от 100. Следующая программа почти не отличается от предыдущей — только последние два конструктора Font создают 24-пунктные шрифты, пригодные для вывода на принтер.

TwentyFourPointPrinterFonts.cs

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

  class TwentyFourPointPrinterFonts: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new TwentyFourPointPrinterFonts());
      }
      public TwentyFourPointPrinterFonts()
      {
          Text = "Twenty-Four Point Printer Fonts";
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          Brush  brush     = new SolidBrush(clr);
          float  y         = 0;
          Font   font;
          string strFamily = "Times New Roman";

          font = new Font(strFamily, 24);
          grfx.DrawString("No GraphicsUnit, 24 points", font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, 24, GraphicsUnit.Point);
          grfx.DrawString("GraphicsUnit.Point, 24 units", font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, 1/ 3f, GraphicsUnit.Inch);
          grfx.DrawString("GraphicsUnit.Inch, 1/3 units", font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, 25.4f / 3, GraphicsUnit.Millimeter);
          grfx.DrawString("GraphicsUnit.Millimeter, 25.4/3 units", 
                          font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, 100, GraphicsUnit.Document);
          grfx.DrawString("GraphicsUnit.Document, 100 units", 
                          font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, 100f / 3, GraphicsUnit.Pixel);
          grfx.DrawString("GraphicsUnit.Pixel, " + 100f / 3 + " units",
                          font, brush, 0, y);
          y += font.GetHeight(grfx);

          font = new Font(strFamily, 100f / 3, GraphicsUnit.World);
          grfx.DrawString("GraphicsUnit.World, " + 100f / 3 + " units", 
                          font, brush, 0, y);
      }
  }

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


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

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