netlib.narod.ru | < Назад | Оглавление | Далее > |
При экспериментировании с параметрами конструктора Font возникает вопрос: как единицы измерений шрифтов взаимодействуют с мировым и страничным преобразованиями? И класс Font, и класс Graphics используют перечисление GraphicsUnit. Класс Font использует перечисление GraphicsUnit в некоторых своих конструкторах, а свойство PageUnit класса Graphics принимает одно из значений этого перечисления.
Мы уже немного знаем об этом взаимодействии. Давайте проанализируем его и выведем твердые правила.
Заметьте: объекты Font не зависят от устройств. Когда вы создаете шрифты, не имеет значения, какое применяется преобразование — мировое или страничное. Конструктор Font ничего об этом не знает. Вы можете создать объекты Font в любом месте вашей программы независимо от того, находится объект Graphics в области видимости или нет.
В основном используется только три метода, работающих с объектом Font (который создается с определенными размерами, измеряемыми в определенных единицах) и объектом Graphics (с которым связаны мировое и страничное преобразования):
DrawString, метод класса Graphics, который имеет аргумент Font;
MeasureString, метод класса Graphics, который имеет аргумент Font;
GetHeight, метод класса 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 | < Назад | Оглавление | Далее > |