Координатные системы
ОС Windows для определения областей на поверхности рисования использует три системы координат:
•координаты устройства;
•логические координаты;
•мировые координаты.
Координаты устройстваопределяются техническими характеристиками аппаратного устройства, с которым работает Windows. В качестве единицы измерения применяется пиксел, а ориентация координат – слева направо для оси X и сверху вниз для оси Y. Начало отсчета координат расположено в верхнем левом углу.
Логические координатысоответствуют координатам любой области, обладающей контекстом устройства. Например, контекстом обладает поверхность формы TForm и поверхность холста TPaintBox.
Мировые координатыпредназначены для осуществления операций вращения растра, сдвига, скручивания и т. п. Методы GDI требуют передачи логических координат. Получив эти значения, операционная система транслирует их в пикселы – координаты устройства. Для получения полной картины стоит упомянуть еще ряд терминов, связанных с координатными системами. Когда мы работаем с экраном в целом, говорят, что работа осуществляется в экранных координатах.
При работе с окном применяют еще два термина: координаты рабочей области окнаи полные координаты окна. Полные координаты окна определяют окно программы целиком, включая заголовок, меню, полосы прокрутки и рамку окна. Координаты рабочей области окна описывают только внутреннюю поверхность окна.
Все три системы координат отличаются физическим расположением точки начала отсчета координат (0,0). Для экранных координат это левая верхняя точка экрана. Для координат рабочей области окна это левая верхняя точка рабочей области окна. Для полных координат окна это левый верхний угол рамки окна.
Режимы отображения
Практически все функции Windows GDI и как следствие методы класса TCanvas в качестве параметров требуют передачи логических координат. Вызывая метод TextOut(5, 5, 'Hello Word!'), мы информируем систему вывода о том, что хотим увидеть надпись «Hello World!» в левом верхнем углу, причем верхний левый пиксел текста должен находиться в точке с координатами (5,5). Логические координаты созданы специально для нас с целью максимально упростить нашу работу.
Операционная система должна преобразовать логические координаты в физические координатыустройства – единицы измерения устройства, на котором мы рисуем. Мы уже привыкли к тому, что система координат Windows берет начало в левом верхнем углу рабочей поверхности в точке с координатами (0,0), горизонтальная ось X проведена из крайней верхней точки поверхности рисования в крайнюю правую точку, а ось Y берет начало в той же точке (0,0) и идет вертикально вниз.
Такой режим отображения называется текстовым (в терминах Windows ему соответствует идентификатор MM_TEXT), поскольку оси X и Y проведены точно так же, как и при чтении текста – слева направо, сверху вниз. Как видите, в данном случае физические координаты устройства (пикселы) полностью совпадают с нашими логическими координатами. Однако в Windows помимо текстового режима реализовано еще семь режимов отображения (табл. 10.7).
Таблица 10.7. Режимы отображения в Windows
Классификация | Режим отображения | Логически единицы | Направления осей |
Текстовый режим | MM_TEXT | Пиксел | X – вправо, Y – вниз |
Метрические режимы | MM_LOMETRIC MM_HIMETRIC MM_LOENGLISH MM_HIENGLISH MM_TWIPS | 0.1 мм 0.01 мм 0.01 дюйма (0.254 мм)0.001 дюйма (0.0254 мм) 1/1440 дюйма (0.0176 мм) | X – вправо, Y – вверх |
Пользовательские режимы | MM_ISOTROPIC MM_ANISOTROPIC | Настраиваемые Настраиваемые | Настраивается |
В первую очередь режимы отображения различаются единицами измерения. Если не брать во внимание настраиваемые пользовательские режимы отображения, то самый точный из режимов – MM_HIMETRIC. Он позволяет осуществлять операции рисования с шагом в одну сотую миллиметра. Самый грубый – MM_LOENGLISH; его единица измерения – одна сотая дюйма. Второе различие между режимами заключается в направлении вертикальной оси Y.
По умолчанию всегда установлен текстовый режим MM_TEXT. Особенность текстового режима заключается в том, что его логическая единица измерения полностью совпадает с физической; это пиксел. Геометрический размер пиксела определяется качеством монитора, например у моего экрана он составляет 0,2 мм.
За назначение режима отображения отвечает функция Windows:
functionSetMapMode(DC : HDC; fnMapMode : Integer) : Integer;
где DC – дескриптор контекста устройства, а fnMapMode – константа режима отображения. В случае успешного выполнения метод возвращает значение предыдущего режима отображения, в противном случае – 0.
Для определения текущего режима понадобится метод из коллекции Windows API:
functionGetMapMode(DC : HDC) : Integer;
Функция требует указать дескриптор контекста DC и возвращает соответствующий режим отображения. Переключение между режимами отображения элементарно и представлено в следующем листинге.
varDC : HDC;
s : string;
Begin
DC:=Form1.Canvas.Handle; //получаем контекст поверхности формы
SetMapMode(DC,MM_TEXT); //текстовый режим отображения
s:='режим MM_Text';
TextOut(DC,5,5,PChar(s),Length(s)); //строка начинается в точке (5,5)
SetMapMode(DC,MM_LOMETRIC); //переводим в метрический режим
s:='режим MM_LOMETRIC';
TextOut(DC,100,-100,PChar(s),Length(s)); //строка начинается в точке (10,-10) мм
end;
Поясню некоторые строки листинга. Во-первых, для вывода текста применялся метод TextOut() из набора функций Windows GDI, а не изученный нами ранее одноименный метод класса TCanvas. Однако никто не запрещает вместо методов Windows API применять методы из визуальной библиотеки компонентов Delphi (VCL), и в частности методы холста формы. Только в этом случае вместо непосредственного вызова TextOut() требуется указать, что мы планируем работать с методом холста:
Form1.Canvas.TextOut(5,5,s);
Во-вторых, обращаю внимание, что в режиме отображения MM_LOMETRIC (табл. 10.7) направление оси Y отличается от направления этой же оси в текстовом режиме. Во всех метрических режимах отображения ось Y направлена снизу вверх. А так как начало отсчета координат по умолчанию стартует в левом верхнем углу, то при повторном выводе текста мы были вынуждены указать отрицательную координату Y; в противном случае Windows вывела бы текст за пределами области вывода.
Дата добавления: 2016-03-15; просмотров: 1167;