Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
экзамен СП.docx
Скачиваний:
13
Добавлен:
22.04.2019
Размер:
515.86 Кб
Скачать

Х.2 Системы координат и единицы измерения

Все координаты, а также размеры (например, толщина линии инструментов) в GDI исчисляются в логических единицах (logical units). Величина логической единицы и соответствие ее физическим, а также направления отсчета координат составляют режим отображения (mapping mode). Помимо общего изменения единиц измерения в "квадратной" системе координат, можно установить различные коэффициенты пропорциональности по горизонтальной и вертикальной осям с целью устранения (компенсации) или, наоборот, целенаправленного внесения искажений "неквадратности" пикселов. Данная возможность особенно актуальна при работе с устройствами с подобными искажениями, например, принтером с различными вертикальным и горизонтальным разрешениями. Предусмотрены следующие режимы отображения:

– MM_TEXT – логическая единица соответствует 1 пикселу (pixel, pel – picture element) – одной физической экранной точке, направление координатных осей – вправо и вниз, т.е. в экранной системе координат; этот режим устанавливается по умолчанию;

– MM_LOENGLISH, MM_HIENGLISH – логическая единица равна соответственно 0,01 и 0,001 дюйма (inch), направление координатных осей – вправо вверх;

– MM_LOMETRIC, MM_HIMETRIC – логическая единица равна соответственно 0,1 и 0,01 миллиметра, направление координатных осей – вправо вверх;

– MM_TWIPS – логическая единица соответствует 1/20 стандартной печатной точки (1/72 дюйма), т.е. 1/1440 дюйма ("twip" – twentieth of a printer's point), направление координатных осей – вправо вверх; печатная точка, или пункт (pt), является типографской единицей измерения, принимается также как условное стандартное разрешение матричного принтера и экрана;

– MM_ISOTROPIC – единица измерения и направление отсчета координат устанавливаются дополнительно (см. ниже);

– MM_ANISOTROPIC – то же, но единица измерения может быть задана различной по вертикальной и горизонтальной осям.

Для изменения и получения режима отображения служат функции:

int SetMapMode(HDC hDC, int fnMapMode);

int GetMapMode(HDC hDC);

Коды возврата обоих функций и параметр fnMapMode принимают перечисленные выше значения. Функция установки режима возвращает его предыдущее значение.

Режимы MM_ISOTROPIC и MM_ANISOTROPIC требуют использования дополнительных функций для установки "разрешающей способности" логической системы координат. Данный параметр задается отдельно для окна (window), к которому относится контекст, и поля вывода (viewport) в целом:

BOOL SetWindowExtEx(

HDC hDC, int nXExtent, int nYExtent, LPSIZE lpSize

);

BOOL SetViewportExtEx(

HDC hDC, int nXExtent, int nYExtent, LPSIZE lpSize

);

Действие функций: установка соотношения вертикального и горизонтального масштабов логических единиц относительно физических для соответственно окна и поля вывода. Эффективны только для контекстов с режимами MM_ISOTROPIC и MM_ANISOTROPIC. В режиме MM_ISOTROPIC вызову SetViewportExtEx() должен предшествовать вызов SetWindowExtEx().

Возвращаемое значение: признак успешности выполнения и заполненная структура lpSize (если не NULL).

Параметры:

hDC – описатель контекста;

nXExtent, nYExtent – вертикальный и горизонтальный размеры.

lpSize – указатель на структуру SIZE (поля cx и cy типа LONG), в которую записываются предыдущие значения, может быть NULL.

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

Помимо соотношения размеров, задается также направление координатных осей: совпадение знаков разрешений окна и поля вывода задает направление осей, совпадающие с физической системой координат, противоположные знаки – противоположные направления. Напомним, что направление вертикальной оси экранной системы координат – сверху вниз, т.е. противоположно принятому стандартному "математическому" и "чертежному".

В качестве примера приведем значения разрешений поля вывода и окна, устанавливаемых в различных режимах (Windows NT, экранное разрешение 800600):

– MM_LOMETRIC – 800-600, 32002400;

– MM_HIMETRIC – 800-600, 3200024000;

– MM_LOENGLISH – 800-600, 1260945;

– MM_HIENGLISH – 800-600, 125989449;

– MM_TWIPS – 800-600, 1814213606;

– MM_TEXT – 11, 11;

– MM_ANISOTROPIC – изначально 11, 11 (соответствует MM_LOMETRIC);

– MM_ISOTROPIC – изначально 800-600, 32002400 (соответствует MM_TEXT).

Как видно из примера, разрешение поля вывода задается либо "единичным", либо в соответствии с текущим видеорежимом, отрицательное значение "разворачивает" вертикальную ось в привычном направлении.

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

Текущие значения разрешений и начала отсчета могут быть получены с помощью функций GetWindowExtEx(), GetViewportExtEx(), GetWindowOrgEx(), GetViewportOrgEx().

При необходимости логические координаты точки (размеры) в данном контексте могут быть пересчитаны в физические (экранные, пиксельные, device-dependent) и обратно с помощью функций:

BOOL LPtoDP(HDC hDC, LPPOINT lpPoints, int nCount);

BOOL DPtoLP(HDC hDC, LPPOINT lpPoints, int nCount);

Возвращаемое значение: признак успешности выполнения; модификация структур в переданном массиве lpPoints.

Параметры:

hDC – контекст устройства

lpPoints – массив структур POINT (поля x и y типа LONG);

nCount – количество обрабатываемых структур в массиве.

При преобразовании координат учитывается их знак: меняется на противоположный, если изменяется направление соответствующей оси. Данное обстоятельство следует учитывать при работе не с координатами (векторами), а линейными размерами (абсолютными величинами).

По умолчанию началом координат во всех режимах является левый верхний угол окна, поэтому в режимах с "обычными" (не экранными) направлением осей положительные вертикальные координаты находятся за пределами видимой области (выше окна).

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

Расположение и размеры самих окон от режима отображения не зависят!

Настройки как поля вывода, так и окна локальны для данного контекста и не затрагивают другие контексты, даже если они связаны с одним и тем же самым объектом "окно".

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]