Рассмотрим различные системы координат, которые Windows использует для дисплея. Кроме системы, связанной с рабочей областью окна, Windows использует две другие системы для устройств отображения. Во всех системах координат устройств отображения координаты представляются в пикселах. Ось x системы координат направлена вправо, y – вниз.
Когда мы используем весь экран дисплея, мы работаем в т.н. «экранных координатах». При этом начало координат находится в верхнем левом углу экрана. Экранные координаты используются в сообщении WM_MOVE, а также в следующих функциях: CreateWindow, MoveWindow, GetCursorPos, SetCursorPos, GetWindowRect, WindowFromPoint. Если используется функция CreateDC для получения контекста устройства всего экрана дисплея, то при использовании GDI функций логические координаты переводятся Windows в экранные координаты.
Остальные две системы координат связаны не со всем экраном дисплея, а с конкретным окном.
Вторая система координат называется «оконная система координат». Ее начало координат находится в левом верхнем углу рамки окна. Данная система координат описывает все окно, включая меню, полосы просмотра и заголовок. Для использования оконной системы координат надо получать контекст устройства, вызывая функцию GetWindowDC. При этом GDI функции, использующие данный контекст, преобразуют логические координаты в экранные.
И наконец, третья система координат связана с рабочей областью окна. Начало координат данной системы находится в левом верхнем углу рабочей области окна. Когда вы получаете контекст устройства при помощи функций GetDC и BeginPaint, то логические координаты, используемые функциями GDI, транслируются Windows в координаты рабочей области окна.
Первый атрибут контекста устройства называется «режим отображения» и определяет, как логические координаты используемые GDI функциями, преобразуются в физические координаты устройства отображения. При этом система координат устройства отображения может быть экранной, оконной или системой координат рабочей области окна.
Физические координаты устройства отображения имеют в качестве единицы измерения пиксел, а логическая система координат может использовать как единицу измерения и пикселы, и миллиметры, и дюймы.
В данном (текстовом) режиме работы оси координат направлены соответственно: x – вправо, а y – вниз. Изначально центр системы координат находится в левом верхнем углу (экрана, окна или рабочей области окна в зависимости от того, как получен контекст устройства):
Рис. Режим отображения MM_TEXT
При помощи функций SetViewOrgEx и SetWindowOrgEx можно сместить начало координат в любую точку экрана.
Например, пусть нам необходимо поместить точку с логическими координатами x=0; y=0 в центр рабочей области окна, то мы можем использовать функцию SetViewportOrg:
SetViewportOrgEx (hDC, // Контекст устройства
xClient/2, // Ширина рабочей области окна в пикселах
yClient/2 // Высота рабочей области окна в пикселах
NULL);
Система координат будет иметь следующий вид:
-Y
-X +X
+Y
Рис. Начало координат смещено в центр экрана
Теперь функции, использующие логические координаты, будут считать началом координат центр экрана.
Можно воспользоваться для изменения начала координат также функцией SetWindowOrgEx();
SetWindowOrgEx (hDC, // Контекст устройства
xClient/2 // Половина ширины рабочей области
// в логических единицах
yClient/2 // Половина высоты рабочей области
// в логических единицах
NULL);
Разница заключается в том, что в функции SetViewportOrgEx параметры задаются в единицах физического устройства, а в SetWindowOrgEx в логических единицах.