К метрическим режимам отображения относятся режимы MM_LOMETRIC, MM_HIMETRIC, MM_LOENGLISH, MM_HIENGLISH и MM_TWIPS. Эти режимы позволяют использовать привычные единицы измерения, такие как миллиметры и дюймы.
В метрических режимах отображения используются полные формулы преобразования координат, приведенные выше. В этих формулах приложение может изменять переменные, определяющие смещение начала физической или логической системы координат () и ().
Приложение не может изменить значения переменных и от которых зависит масштаб по осям координат. Отношения и имеют фиксированное значение для каждого из метрических режимов отображения.
Заметим, что для этих режимов отношение имеет отрицательный знак, в результате чего ось оказывается направленной снизу вверх.
Остановимся подробнее на описании режимов MM_ISOTROPIC и MM_ANISOTROPIC.
Режимы отображения MM_ISOTROPIC (изотропный) и MM_ANISOTROPIC (анизотропный) допускают изменение направления осей X и Y, а также изменение масштаба осей координат. В изотропном режиме отображения MM_ISOTROPIC масштаб вдоль осей X и Y всегда одинаковый (т. е. для обоих осей используются одинаковые логические единицы длины). Анизотропный режим MM_ANISOTROPIC предполагает использование разных масштабов для разных осей (хотя можно использовать и одинаковые масштабы).
|
|
Для изменения ориентации и масштаба осей можно воспользоваться функциями SetViewportExt и SetWindowExt, которые являются методами класса CDC из библиотеки MFC:
virtual CSize SetWindowExt(int cx, int cy ),
virtual CSize SetViewportExt(int cx, int cy ).
Функция SetWindowExt устанавливает для формулы преобразования координат значения переменных и .
Функция SetViewportExt устанавливает для формулы преобразования координат значения переменных и . Функция SetViewportExt должна использоваться после функции SetWindowExt.
Изотропный режим отображения удобно использовать в тех случаях, когда надо сохранить установленное отношение масштабов осей X и Y при любом изменении размеров окна, в которое выводится изображение.
Анизотропный режим удобен в тех случаях, когда изображение должно занимать всю внутреннюю поверхность окна при любом изменении размеров окна. Соотношение масштабов при этом не сохраняется.
Сравним теперь выражения для пересчета координат из мировых в оконные (5.3), полученные нами ранее
и формулы (6.1) по которым пересчитывают координаты функции GDI Windows.
Из сравнения следует, что если положить
, | , |
, | , |
, | , |
, | , |
то пересчет координат из мировых в оконные можно возложить на функции GDI Windows, установив предварительно режим отображения MM_ANISOTROPIC.
Замечание. При использовании режима MM_ANISOTROPIC следует иметь в виду особенности реализации в Win32 API объекта логического пера []. Дело в том, что при вызове функции создании пера, значение параметра, задающего его толщину, определяется отношениями и . При таком определении, толщина пера может быть различной для рисования по вертикали и горизонтали. Исключением является нулевое значение толщины, определяющее перо толщиной в 1 пиксел.
|
|
Ниже приводится возможный вариант функции (при использовании библиотеки классов MFC) для установки режима отображения MM_ANISOTROPIC когда заданы области отображения в моровых и оконных координатах.
void Set MyMode(CDC& dc, CRect& RS, CRect& RW) //MFC
// dc - ссылка на класс CDC MFC
// RS - область в мировых координатах
// RW - область в оконных координатах
{
int dsx=RS.right-RS.left;
int dsy=RS.top-RS.bottom;
int xsL=RS.left;
int ysL=RS.bottom;
int dwx=RW.right-RW.left;
int dwy=RW.bottom-RW.top;
int xwL=RW.left;
int ywH=RW.bottom;
dc.SetMapMode(MM_ANISOTROPIC);
dc.SetWindowExt(dsx,dsy);
dc.SetViewportExt(dwx,-dwy);
dc.SetWindowOrg(xsL,ysL);
dc.SetViewportOrg(xwL,ywH);
}