Метрические режимы отображения

К метрическим режимам отображения относятся режимы 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);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: