Сопоставление координат

   
На этом шаге мы рассмотрим возможные режимы сопоставления экранных и общепринятых координат.

   
В графических устройствах вывода применяется двумерная система координат. При выводе на экран используется
пиксельная сетка, на принтеры - двумерный массив точек печатной страницы. Аналогичная система применяется в
Windows-приложениях графическими функциями. GDI работает с абстрактными единицами измерения,
которые называются логическими единицами (logical units).

   
В качестве примера ниже приведена строка из функции OnDraw(), которая инициализирует объект шрифта
для текста, выводимого в контекст устройства. Высота создаваемого шрифта составляет 16 логических единиц.

  aFont.CreateFont(16,0,0,0,0,0,0,0,0,0,0,0,FF_ROMAN,0);

   
В следующем фрагменте кода сначала текущая позиция в графическом представлении переносится в точку с
координатами (100,200), а затем рисуется горизонтальная линия длиной 200 логических единиц до точки с
координатами (300,200).

  pDC->MoveTo(100, 200); 
  pDC->LineTo(300, 200);

   
Логические единицы не имеют физического смысла. Чтобы придать им физический смысл, Вам нужно приравнять их
к единицам измерения устройства. Это делается посредством реализованной в GDI системы сопоставления
координат (coordinate mapping system), обеспечивающей стандартный интерфейс к различным типам дисплеев,
принтеров и прочих устройств вывода. Задавая режим сопоставления (mapping mode), Вы определяете способ
перевода логических единиц, в которых измеряется область рисования приложения, в единицы устройства (device units),
выполняющего аппаратный вывод изображения. GDI гарантирует адекватное отображение на любом устройстве вывода.

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

  • Просмотр вывода в режиме ММ_ТЕХТ.
  • Запустите приложение МуАрр.
  • В меню Data выберите пункт Edit и наберите строку примерно 60 символов, которая будет выведена 20 раз.
  • Если к Вашему компьютеру подсоединен принтер, в меню File выберите Print, чтобы распечатать
    данные приложения. Если принтер не подсоединен, в меню File выберите Print Preview, чтобы посмотреть данные в таком виде,
    в каком они могли бы быть напечатаны на бумаге.

   
Обратите внимание, какое крохотное изображение появляется при печати. Причина уменьшения изображения в различном разрешении экрана и принтера.
Графические функции масштабируют вывод в единицах разрешения устройства вывода. Поэтому символ высотой в 16 пикселей имеет на мониторе с
разрешением 800 на 600 высоту около 5 мм, а на принтере с разрешением 600 на 600 точек на дюйм его высота составит примерно 0,7 мм.

   
ММ_ТЕХТ - один из шести фиксированных режимов сопоставления, в котором устанавливается прямое соотношения между логическими
единицами и единицами устройства. В остальных фиксированных режимах логические единицы преобразуются в единицы длины.
Например в режиме MM_LOENGLISH логическая единица соответствует 0,01 дюйму на устройстве вывода. Перечень фиксированных режимов
сопоставления координат приведен в таблице 1.

Таблица 1. Фиксированные режимы сопоставления координат

Режим сопоставления координат Единице вывода соответствует
ММ_ТЕХТ Один пиксель устройства
MM_LOENGLISH 0,01 дюйма
MM_HIENGLISH 0,001 дюйма
MM_LOMETRIC 0,1 мм
MM_HIMETRIC 0,01 мм
MM_TWIPS 1/1440 дюйма

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

   
Кроме фиксированных режимов Вы можете использовать и нефиксированные режимы сопоставления MM_ISOTROPIC
и ММ_ANISOTROPIC. В них нет жестких соотношений между логическими и физическими единицами,
поэтому их надо задавать самостоятельно. Когда установлен режим MM_ISOTROPIC, GDI непрерывно
регулирует соотношения координат таким образом, чтобы одна логическая единица имела одинаковый физический
размер в обоих (х и у) направлениях. В режиме MM_ANISOTROPIC соотношение между
координатами х и у может быть произвольным.

   
Чтобы задать соотношение между логическими и физическими единицами, нужно описать два прямоугольника. Первый
определяет относительные размеры логической области, которая называется окном (window),
второй - области устройства, которая называется областью просмотра (viewport). Размеры
окна задаются в логических единицах с помощью функции CDC::SetWindowExt(). Область просмотра
измеряется в единицах устройства и устанавливается функцией CDC::SetViewportExt(). Информацию о текущих
размерностях устройства получают вызовом функции CDC::GetDeviceCaps().

   
Следующий код устанавливает режим сопоставления координат, аналогичный MM_LOENGLISH:

pDC->SetMapMode(MM_ANISOTROPIC); 
pDC->SetViewPortExt(pDC->GetDeviceCaps(LOGPIXELSX),
          pDC->GetDeviceCaps(LOGPIXELSY)); 
pDC->SetWindowExt(100, -100);

   
Параметры LOGPIXELSX и LOGPIXELSY передают функции GetDeviceCaps() число пикселей в логическом
дюйме дисплея по ширине и высоте соответственно. В показанном выше фрагменте задано, что изображаемый на устройстве
квадрат со стороной 1 дюйм соответствует квадрату в графической области приложения со стороной 100 логических
единиц. Другими словами, одна логическая единица эквивалентна 0,01 дюйма на устройстве вывода.

   
Обратите внимание, что параметр у функции SetWindowExt() имеет отрицательное значение. По умолчанию
начало координат устройств в соответствии с соглашениями Windows находится в верхнем левом углу окна,
и значения у увеличиваются сверху вниз. Задав отрицательное соотношение между координатами у окна
и области просмотра, Вы можете выполнять графические функции в общепринятой математической системе координат,
в которой значения у увеличиваются снизу вверх. Только учтите, что начало экранной системы координат
(точка с координатами (0,0)) находится по умолчанию в верхнем левом углу окна, и если координаты у увеличиваются
снизу вверх, то выводимые изображения не будут видны. Если Вы не хотите, чтобы рисование выходило в область, лежащую
выше верхней границы окна, либо измените знак координаты у, либо сместите началj координатной системы окна в точку,
соответствующую левому ниж нему углу логического окна.

   
Фиксированные режимы сопоставления координат следуют математическому соглашению, в соответствии с которым
значения координаты х увеличиваются слева направо, координаты у - снизу вверх. Режим ММ_ТЕХТ следует
Windows-соглашению, по которому значения координаты у увеличиваются сверху вниз.

   
Установив наиболее удобный режим сопоставления координат, Вы сможете воспроизводить изображения средствами графических
GDI-функций, используя логические координаты. Преобразования между логическими и физическими координатами обрабатываются автоматически.
Однако иногда требуется дополнительное преобразование координат, поскольку некоторые данные поступают только в координатах устройства.
Например, позиция щелчка мышью передается функции-обработчику CView::OnLButtonDown() в виде параметра,
состоящего из пары физических координат. Чтобы узнать, попадает ли этот щелчок в определенную зону логической
области окна, нужно выполнить преобразование координат. Эта возможность реализуется CDC-методами LPtoDP() и DPtoLP().

   
На следующем шаге мы рассмотрим реализацию прокрутки.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий