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

4.6.3 Область вывода и окно

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

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

Область вывода описывается в терминах координат устройства (пикселях). Чаще всего область вывода — это то же самое, что и рабочая область, хотя область вывода может описываться также и в полных координатах окна или в координатах экрана, если вы получили контекст устройства из функций GetWindowDC или CreateDC. Точка (0, 0) — левый верхний угол рабочей области (или окна целиком, или всего экрана). Значения координаты x возрастают слева направо, а значения координаты y — сверху вниз.

"Окно" описывается в терминах логических координат. Ими могут быть пиксели, миллиметры, дюймы или любые другие единицы, какие вы захотите. В вызовах функций GDI вы задаете логические координаты.

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

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

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

где (xWindow, yWindow) — логическая точка для преобразования, (xViewport, yViewport) — преобразованная точка в координатах устройства. Если координаты устройства — это координаты рабочей области или окна целиком, то Windows должна также преобразовать их в координаты экрана перед выводом объекта.

Эти формулы используют две точки, задающие начала координат (origin) окна и области вывода: (xWinOrg, yWinOrg) — начало координат окна в логических координатах; (xViewOrg, yViewOrg) — начало координат области вывода в координатах устройства. В контексте устройства, установленном по умолчанию, обе эти точки установлены в точку (0, 0), но они могут быть изменены. Эти формулы гарантируют, что точка с логическими координатами (xViewOrg, yViewOrg) всегда преобразуется в точку с физическими координатами (xViewOrg, yViewOrg).

Эти формулы используют также две точки, определяющие "протяженность" (extent): (xWinExt, yWinExt) — протяженность окна в логических координатах; (xViewExt, yViewExt) — протяженность области вывода в координатах устройства. В большинстве режимов отображения протяженности определяются самими режимами и не могут быть изменены. Каждая протяженность сама по себе ничего не значит. Только отношение протяженности области вывода к протяженности окна является коэффициентом масштабирования при пересчете логических координат в координаты устройства. Протяженность может быть отрицательной. Это означает, что величина логической координаты x не обязательно должна возрастать при перемещении вправо, а величина логической координаты y — необязательно возрастать при движении вниз.

Windows может также преобразовывать координаты устройства (физические) в координаты окна (логические):

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

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

Windows имеет также две функции, которые позволяют вам в программе преобразовывать координаты устройства в логические координаты и логические координаты в координаты устройства. Следующая функция преобразует точки устройства в логические точки:

DPtoLP(hdc, pPoints, iNumber);

Переменная pPoints — это указатель на массив структур типа POINT, iNumber — число преобразуемых точек. Вы обнаружите, что эта функция очень полезна для преобразования размера рабочей области, полученного от функции GetClientRect (которая всегда оперирует с координатами устройства), в логические координаты:

GetClientRect(hwnd, &rect);

DPtoLP(hdc,(PPOINT) &rect, 2);

Следующая функция преобразует логические точки в физические точки:

LPtoDP(hdc, pPoints, iNumber);

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