Основные сведения о проблемах с масштабированием экрана
Windows Vista и более поздние версии операционной системы позволяют пользователям изменять параметр точек на дюйм (точек на дюйм), чтобы большинство элементов пользовательского интерфейса на экране отображались больше. В более ранних версиях Windows масштабирование должно было быть реализовано приложениями. В Windows Vista и более поздних версиях диспетчер окон рабочего стола (DWM) выполняет масштабирование по умолчанию для всех приложений, которые не обрабатывают собственное масштабирование. Клиентские приложения Microsoft модель автоматизации пользовательского интерфейса должны учитывать эту функцию.
Этот раздел состоит из следующих подразделов.
- Масштабирование в Windows Vista и более поздних версиях
- Масштабирование в клиентах автоматизации пользовательского интерфейса
Масштабирование в Windows Vista и более поздних версиях
Значение по умолчанию — 96 пикселей. Это означает, что 96 пикселей занимают ширину или высоту одного условного дюйма. Точный размер "дюйма" зависит от размера и физического разрешения монитора. Например, на мониторе шириной в 12 дюймов при горизонтальном разрешении в 1280 пикселей горизонтальная линия в 96 пикселей имеет протяженность около 9/10 дюйма.
Изменение параметра разрешения на дюйм не совпадает с изменением разрешения экрана. При масштабировании точек на дюйм количество физических пикселей на экране остается неизменным. Однако масштабирование применяется к размеру и расположению элементов пользовательского интерфейса. Это масштабирование может выполняться автоматически dwM для настольных компьютеров и приложений, которые не запрашивают явное масштабирование.
Фактически, когда пользователь устанавливает коэффициент масштабирования 120 точек на дюйм, вертикальный или горизонтальный дюйм на экране становится больше на 25 процентов. Все измерения масштабируются согласованно. Смещение окна приложения от верхнего и левого края экрана увеличивается на 25 %. Если масштабирование приложения включено и приложение не поддерживает разрешение на дюйм, размер окна увеличивается в той же пропорции, а также смещения и размеры всех элементов пользовательского интерфейса, содержащихся в нем.
Примечание
По умолчанию DWM не выполняет масштабирование для приложений, не поддерживающих разрешение на дюйм, когда пользователь устанавливает разрешение на дюйм 120, но выполняет масштабирование, если для параметра dpi задано пользовательское значение 144 или выше. Тем не менее пользователь может переопределить поведение по умолчанию.
Масштабирование экрана создает новые проблемы для приложений, которые каким-либо образом связаны с экранными координатами. Теперь экран содержит две системы координат: физическую и логическую. Физические координаты точки — это фактическое смещение в пикселях от верхнего левого края исходной точки. Логические координаты — это смещения, какими они были бы, если бы сами пиксели масштабировались.
Предположим, вы разрабатываете диалоговое окно с кнопкой, имеющей координаты (100, 48). Если это диалоговое окно отображается с разрешением по умолчанию 96 точек на дюйм, кнопка находится в физических координатах (100, 48). При 120 точек на дюйм он находится в физических координатах (125, 60). Но логические координаты одинаковы при любом параметре dpi: (100, 48).
Логические координаты важны, так как они делают поведение операционной системы и приложений согласованным, независимо от параметра dpi. Например, обычно функция GetCursorPos возвращает логические координаты. При намещении курсора на элемент в диалоговом окне возвращаются одни и те же координаты, независимо от значения разрешения на дюйм. Если вы рисуете элемент управления в (100, 100), он отрисовывается к этим логическим координатам и будет занимать ту же относительную позицию при любом параметре dpi.
Масштабирование в клиентах автоматизации пользовательского интерфейса
API модель автоматизации пользовательского интерфейса не использует логические координаты. Следующие методы и свойства возвращают физические координаты или принимают физические координаты в качестве параметров.
- IUIAutomation::ElementFromPoint
- IUIAutomation::ElementFromPointBuildCache
- IUIAutomationElement::GetClickablePoint
- IUIAutomationElement::CurrentBoundingRectangle
- IUIAutomationElement::CachedBoundingRectangle
- IRawElementProviderFragment::BoundingRectangle
По умолчанию модель автоматизации пользовательского интерфейса приложения, работающие в среде без разрешения 96 точек на дюйм, не получают правильные результаты от этих методов и свойств. Например, поскольку позиция курсора находится в логических координатах, клиент не может передать эти координаты в IUIAutomation::ElementFromPoint , чтобы получить элемент, который находится под курсором. Кроме того, такое приложение не сможет правильно разместить окна за пределами клиентской области.
Решение состоит из двух частей.
Сначала сделайте клиентское приложение с поддержкой DPI. Для этого вызовите функцию SetProcessDPIAware при запуске. Эта функция обеспечивает поддержку dpi для всего процесса, что означает, что все окна, принадлежащие процессу, не масштабируются.
Во-вторых, чтобы получить координаты курсора, вызовите функцию GetPhysicalCursorPos .