Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

Mm_anisotropic: растягивание изображения

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

С одной стороны, можно использовать режим MM_ANISOTROPIC в тех случаях, когда имеются произвольные координаты рабочей области, так же как и в режиме MM_ISOTROPIC. Приведенный ниже код устанавливает точку (0, 0) в левый нижний угол рабочей области и с диапазоном по осям x и y от 0 до 32767:

SetMapMode(hdc, MM_ANISOTROPIC);

SetWindowExtEx(hdc,32767, 32767, NULL);

SetViewportExtEx(hdc, cxClient, -cyClient, NULL);

SetViewportOrgEx(hdc, 0, cyClient, NULL);

В режиме MM_ISOTROPIC похожий фрагмент программы приводил к тому, что часть рабочей области оказывалась за границами осей координат. В режиме MM_ANISOTROPIC правый верхний угол рабочей области — это всегда точка (32767, 32767) независимо от размеров. Если рабочая область не квадратная, то логические координаты x и y будут иметь различные физические размерности.

В предыдущем разделе говорилось о том, что в режиме отображения MM_ISOTROPIC в рабочей области можно создавать изображения, где оси x и y ранжированы от -1000 до 1000. Вы можете сделать нечто похожее в режиме MM_ANISOTROPIC:

SetMapMode(hdc, MM_ANISOTROPIC);

SetWindowExtEx(hdc, 1000, 1000, NULL);

SetViewportExtEx(hdc, cxClient / 2, -cyClient / 2, NULL);

SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);

Разница состоит в том, что в режиме MM_ANISOTROPIC круг, как правило, будет представлен в виде эллипса, а не окружности.

С другой стороны, вы можете использовать MM_ANISOTROPIC для установки фиксированных, но не равных друг другу, единиц измерения. Например, если ваша программа занимается только выводом текста, вы можете установить грубые координаты на базе высоты и ширины простого символа:

SetMapMode(hdc, MM_ANISOTROPIC);

SetWindowExtEx(hdc, 1, 1, NULL);

SetViewportExtEx(hdc, cxChar, cyChar, NULL);

(Здесь предполагается, что cxChar и cyChar — ширина и высота символа в пикселях для непропорционального шрифта.) Теперь вы можете в вызове функции TextOut задавать координаты символов как строку и столбец, не используя пиксельные координаты. Например, следующая инструкция выводит текст "Hello" с отступом в три символа слева и два символа сверху:

TextOut(hdc, 3, 2, "Hello", 5);

Это очень похоже на работу в среде MS DOS, а не Windows.

Когда вы впервые устанавливаете режим отображения MM_ANISOTROPIC, он всегда наследует значения протяженностей от предыдущего установленного режима. Это может быть очень удобно. Режим MM_ANISOTROPIC как бы снимает "блокировку" протяженности, т. е. позволяет изменять значения протяженностей. В этом его отличие от полностью принудительных метрических режимов отображения.

Например, предположим, используется режим отображения MM_LOENGLISH, и требуется, чтобы логическая единица измерения равнялась 0.01 дюйма. Причем нежелательно, чтобы значения по координате y увеличивались при движении вверх, нужно, чтобы, как в режиме MM_TEXT, значения координаты y увеличивались при движении вниз. Ниже приведен код, реализующий это:

SIZE size;

[другие строки программы]

SetMapMode(hdc, MM_LOENGLISH);

SetMapMode(hdc, MM_ANISOTROPIC);

GetViewportExtEx(hdc, &size);

SetViewportExtEx(hdc, size.cx, -size.cy, NULL );

Сначала мы устанавливаем режим отображения MM_LOENGLISH. Затем мы даем возможность изменять протяженности, устанавливая режим отображения MM_ANISOTROPIC. Функция GetViewportExtEx записывает протяженности области вывода в поля структуры SIZE. Затем мы вызываем функцию SetViewportExtEx с теми же значениями протяженностей, за исключением того, что протяженность по оси y делается отрицательной.

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