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

4.6.1 Координаты устройства (физические координаты) и логические координаты

Вы можете спросить: если использовать режим отображения MM_LOENGLISH, можно ли получать сообщения WM_SIZE в терминах сотых долей дюйма? Конечно, нет. Windows продолжает использовать координаты устройства для всех сообщений (таких как WM_MOVE, WM_SIZE и WM_MOUSEMOVE), для всех функций, не принадлежащих GDI, и даже для некоторых функций GDI. Посмотрите на это с такой точки зрения: режим отображения — это атрибут контекста устройства, поэтому он начинает работать только тогда, когда вы используете функции GDI, требующие передачи им описателя контекста устройства. GetSystemMetrics — не является функцией GDI, следовательно, она будет продолжать возвращать размеры в координатах устройства, т. е. в пикселях. И хотя функция GetDeviceCaps — функция GDI и требует описателя контекста устройства, Windows продолжает возвращать единицы измерения устройства для индексов HORZRES и VERTRES, поскольку одна из задач этой функции — дать программе сведения о размерах устройства в пикселях.

Тем не менее, величины в структуре TEXTMETRIC, которую можно получить из функции GetTextMetrics, задаются в логических координатах. В режиме отображения MM_LOENGLISH функция GetTextMetrics возвращает информацию о ширине и высоте символов в сотых долях дюйма. Когда вы вызываете функцию GetTextMetrics для получения информации о ширине и высоте символов, режим отображения должен быть установлен таким, каким он будет, когда вы вызовите функцию рисования, использующую эти размеры. Поскольку в этой главе рассматриваются различные функции GDI, ваше внимание будет обращаться на то, какие координаты они используют — логические или физические. Все функции, которые мы рассматривали до сих пор, используют логические координаты, за исключением тех, которые определяют закрашивание пустот между точками и штрихами в линиях, и между штрихами в штриховых шаблонах. Работа этих функций не зависит от режима отображения.

4.6.2 Системы координат устройства

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

Когда мы работаем с экраном целиком, мы работаем в терминах "экранных координат." Левый верхний угол экрана — точка (0, 0). Экранные координаты используются в сообщениях WM_MOVE (для окон верхнего уровня, не дочерних) и в следующих функциях Windows: CreateWindow и MoveWindow (обе для не дочерних окон), GetMessagePos, GetCursorPos, SetCursirPos, GetWindowRect, WindowFromPoint и SetBrushOrgEx. Эти функции, в основном, не имеют окна, ассоциированного с ними (например, две функции работы с курсором), или функции, которые должны переместить или найти окно на основе положения некоторой точки экрана. Если вы используете функцию CreateDC с параметром DISPLAY для получения контекста устройства всего экрана, то логические координаты, указанные в вызовах функций GDI, будут преобразованы в координаты устройства.

"Полные координаты окна" (whole-window coordinates) определяют окно программы целиком, включая заголовок, меню, полосы прокрутки и рамку. Для обычного окна точка (0, 0) — левый верхний угол рамки окна. Полные координаты окна редко используются в Windows, но если вы получите контекст устройства, используя функцию GetWindowDC, то логические координаты в вызовах функций GDI будут преобразовываться в координаты всего окна.

Третья система координат устройства — это та, с которой мы работали больше всего, — система координат рабочей области окна. Точка (0, 0) — верхний левый угол рабочей области окна. Когда вы получаете контекст устройства, используя функции GetDC или BeginPaint, логические координаты в вызовах функций GDI преобразуются в координаты рабочей области окна.

Вы можете конвертировать координаты рабочей области окна в координаты экрана и наоборот, используя функции ClientToScreen и ScreenToClient. Вы можете также получить местоположение и размеры окна целиком в экранных координатах, используя функцию GetWindowRect. Эти три функции предоставляют достаточно возможностей для любых преобразований координат.

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