
- •Использование стандартных перьев
- •Создание, выбор и удаление перьев
- •Закрашивание пустот
- •Режимы рисования
- •Рисование закрашенных областей
- •Функция Polygon и режим закрашивания многоугольника
- •Закрашивание внутренней области
- •Режим отображения
- •Координаты устройства (физические координаты) и логические координаты
- •Системы координат устройства
- •Область вывода и окно
- •Работа в режиме mm_text
- •Метрические режимы отображения
- •Ваши собственные режимы отображения
- •Режим отображения mm_isotropic
- •Mm_anisotropic: растягивание изображения
- •Программа whatsize
- •Прямоугольники, регионы и отсечение
- •Работа с прямоугольниками
- •Случайные прямоугольники
- •Создание и рисование регионов
- •Отсечения: прямоугольники и регионы
- •Программа clover
- •Создание и воспроизведение путей
- •Расширенные перья
Область вывода и окно
Режим отображения определяет, как 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);