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

Преобразование единиц измерения

При экспериментировании с параметрами конструктора Font возникает вопрос: как единицы измерений шрифтов взаимодействуют с мировым и страничным преобразованиями? И класс Font, и класс Graphics используют перечисление GraphicsUnit. Класс Font использует перечисление GraphicsUnit в некоторых своих конструкторах, а свойство PageUnit класса Graphics принимает одно из значений этого перечисления.

Мы уже немного знаем об этом взаимодействии. Давайте проанализируем его и выведем твердые правила.

Заметьте: объекты Font не зависят от устройств. Когда вы создаете шрифты, не имеет значения, какое применяется преобразование — мировое или страничное. Конструктор Font ничего об этом не знает. Вы можете создать объекты Font в любом месте вашей программы независимо от того, находится объект Graphics в области видимости или нет.

В основном используется только три метода, работающих с объектом Font (который создается с определенными размерами, измеряемыми в определенных единицах) и объектом Graphics (с которым связаны мировое и страничное преобразования):

Используя эти три метода, вы должны решать проблемы, связанные с преобразованием разных графических единиц измерения. Два других метода — DrawStringDisabled класса ControlPaint и MeasureCharacterRanges класса Graphics — применяют не так часто.

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


ПРАВИЛО 1

Мировое преобразование воздействует на все одинаковым образом.


Допустим, вам нужно отобразить какие-то графические объекты: наборы линий, закрашенные области и текст, использующий шрифты, созданные с различными аргументами GraphicsUnit. Затем вы решаете, что все размеры надо увеличить вдвое. Для этого перед тем, как вызывать функции графического вывода вы ставите инструкцию

  grfx.ScaleTransform(2, 2);

Глобальное преобразование воздействует на все одинаково. Все: каждая линия, каждая закрашенная область и каждая текстовая строка — удваивается в размерах независимо от того, как шрифт был создан. Но размеры, возвращаемые MeasureString и GetHeight, остаются неизменны.


ПРАВИЛО 2

Для шрифтов, созданных с использованием метрических размеров (т.е. пунктов, дюймов или миллиметров), преобразование страницы не влияет на физические размеры текста.


Допустим, вы создаете 72-пунктный шрифт:

  Font font = new Font("Arial", 72, GraphicsUnit.Point);

и выбираете в качестве единиц измерения для рисования миллиметры:

  grfx.PageUnit = GraphicsUnit.Millimeter;
  grfx.PageScale = 1;

Независимо от преобразования страницы физические размеры текста остаются неизменными. Так как размер шрифта равен 72 пт, это эквивалентно высоте около 25,4 единиц, где в качестве единиц измерения выступают миллиметры.

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

Если вы вставите изменяющие свойства PageUnit или PageScale инструкции в программу TwentyFourPointScreenFonts, то увидите, что первые пять строк текста не изменились. Преобразование страницы повлияли на последние строки. Вот третье правило.


ПРАВИЛО 3

Для шрифтов созданных при помощи единиц GraphicsUnit.Pixel или GraphicsUnit.World, предполагается, что размеры шрифта измеряются в единицах мировых координат.


Иначе говоря, размер шрифта рассматривается просто как координаты и размеры, передаваемые различным методам рисования линий и закрашивания областей класса Graphics. Предположим, вы создаете шрифт:

  Font font = new Font("Arial", 72, GraphicsUnit.World);

Преобразование страницы по умолчанию подразумевает размер шрифта 72 пиксела на мониторе и 72/100 дюйма на принтере. Если установить преобразование страницы в миллиметрах:

  grfx.PageUnit = GraphicsUnit.Millimeter;
  grfx.PageScale = 1;

то размер шрифта 72 будет считаться равным 72 миллиметрам, т.е. почти трем дюймам.

Для шрифтов, созданных с помощью GraphicsUnit.World и GraphicsUnit.Pixel, величины, возвращаемые методами GetHeight и MeasureString, не подвержены влиянию преобразования страницы. Физические размеры шрифта выражаются в единицах, определенных преобразованием страницы, размеры, возвращаемые этими методами, также измеряются в единицах страницы.

Наконец, я не обнаружил разницы между аргументами GraphicsUnit.Pixel и GraphicsUnit.World при создании шрифтов, хотя они и названы по-разному.


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

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