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

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

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

Пять метрических режимов отображения (metric mapping modes) приведены ниже в порядке возрастания точности. Для сравнения в двух правых столбцах приведены размеры логических единиц в дюймах и миллиметрах (мм).

Для того, чтобы дать вам представление о том, как разрешение режима MM_TEXT соотносится с этими разрешениями, скажем, что на стандартном дисплее VGA, каждый пиксель которого имеет размер 0.325 мм в ширину и высоту, физические VGA — координаты грубее, чем логические координаты в любом из метрических режимов отображения.

На лазерном принтере с разрешением 300 точек/дюйм каждый пиксель имеет размер 0.0033 дюйма — это более высокое разрешение, чем в режимах MM_LOENGLISH и MM_LOMETRIC, но более низкое, чем в режимах MM_HIENGLISH, MM_TWIPS и MM_HIMETRIC.

Начала координат и протяженности, заданные по умолчанию, приведены ниже:

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

xViewport = (xWindow — xWinOrg) (xViewExt/xWinExt) + xViewOrg

yViewport = (yWindow — yWinOrg) (yViewExt/yWinExt) + yViewOrg,

В режиме MM_LOENGLISH, например, Windows вычисляет протяженности таким образом, чтобы соблюдались следующие соотношения:

xViewExt/xWinExt = число пикселей по горизонтали в 0.01 дюйма

-yViewExt/yWinExt = число пикселей по вертикали в 0.01 дюйма, взятое со знаком минус

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

Обратите внимание на знак минус перед отношением протяженностей для вертикальной оси. Этот минус изменяет направление оси y.

Для пяти указанных режимов отображения, величина координаты y возрастает при движении вверх. Начала координат окна и области вывода по умолчанию равны (0, 0). Этот факт имеет интересное следствие. Когда вы впервые переключаетесь в один из этих пяти режимов отображения, система координат выглядит так:

Есть только один метод, позволяющий вам отобразить что-нибудь в рабочей области — это использование отрицательных значений координаты y. Например, этот код:

SetMapMode(hdc, MM_LOENGLISH);

TextOut(hdc, 100, -100, "Hello", 5);

выводит "Hello" с отступом в один дюйм слева и сверху рабочей области.

Чтобы избежать этого и работать в привычной системе координат, надо установить логическую точку (0, 0) в левый нижний угол рабочей зоны. Считая высоту рабочей зоны в пикселях равной cyClient, вы можете сделать это, вызвав функцию SetViewportOrgEx:

SetViewportOrgEx(hdc, 0, cyClient, NULL);

Теперь система координат выглядит так:

Аналогично, вы можете установить логическую точку (0, 0) в центр рабочей области:

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

Система координат будет выглядеть так:

Теперь мы имеем настоящую Декартову систему координат с одинаковыми логическими единицами измерения по осям x и y — дюймами, миллиметрами или единицами измерения twips.

Вы можете также использовать функцию SetWindowOrgEx для изменения логической точки (0, 0), но эта задача несколько сложнее, поскольку параметры функции должны задаваться в логических координатах. Вам следовало бы сначала преобразовать пару значений (cxClient, cyClient) в логические координаты, используя функцию DPtoLP. Считая, что переменная pt имеет тип структуры POINT, приведенный ниже код перемещает логическую точку (0,0) в центр рабочей области:

pt.x = cxClient;

pt.y = cyClient;

DPtoLP(hdc, &pt, 1);

SetWindowOrgEx(hdc, -pt.x / 2, -pt.y / 2, NULL);

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