Активные специальные возможности и масштабирование экрана Windows Vista
Windows Vista позволяет пользователям изменять параметр "точка на дюйм", чтобы большинство элементов пользовательского интерфейса на экране отображалось больше. Хотя эта функция уже давно доступна в Microsoft Windows, в предыдущих версиях масштабирование должно было быть реализовано приложениями. В Windows Vista диспетчер окон рабочего стола выполняет масштабирование по умолчанию для всех приложений, которые не обрабатывают собственное масштабирование. Клиентские приложения Microsoft Active Accessibility должны учитывать эту функцию.
Масштабирование в Windows Vista
Значение по умолчанию — 96 пикселей. Это означает, что 96 пикселей занимают ширину или высоту одного условного дюйма. Точный размер "дюйма" зависит от размера и физического разрешения монитора. Например, на мониторе шириной в 12 дюймов при горизонтальном разрешении в 1280 пикселей горизонтальная линия в 96 пикселей имеет протяженность около 9/10 дюйма.
Изменение параметра разрешения на дюйм не совпадает с изменением разрешения экрана. При масштабировании точек на дюйм количество физических пикселей на экране остается неизменным. Однако масштабирование применяется к размеру и расположению элементов пользовательского интерфейса. Это масштабирование может автоматически выполняться диспетчером окон рабочего стола для рабочего стола и для приложений, в которых не указан явный запрет на масштабирование.
Фактически, когда пользователь устанавливает коэффициент масштабирования 120 точек на дюйм, вертикальный или горизонтальный дюйм на экране становится больше на 25 процентов. Все измерения масштабируются согласованно. Смещение окна от верхнего и левого краев экрана увеличивается на 25 процентов. Размер окна увеличивается в той же пропорции, а также смещения и размеры всех элементов пользовательского интерфейса, содержащихся в нем.
По умолчанию DWM не выполняет масштабирование для приложений, не поддерживающих dpi, когда пользователь устанавливает значение 120 dpi, но выполняет его, если для dpi задано настраиваемое значение 144 или выше. Тем не менее пользователь может переопределить поведение по умолчанию.
Масштабирование экрана создает новые проблемы для приложений, которые каким-либо образом связаны с экранными координатами. Теперь экран содержит две системы координат: физическую и логическую. Физические координаты точки являются фактическим смещением в пикселях от верхнего левого угла начала координат. Логические координаты — это смещения, какими они были бы, если бы сами пиксели масштабировались.
Предположим, вы разрабатываете диалоговое окно с кнопкой, имеющей координаты (100, 48). Если это диалоговое окно отображается с разрешением по умолчанию 96 точек на дюйм, кнопка находится в физических координатах (100, 48). При 120 точек на дюйм он находится в физических координатах (125, 60). Но логические координаты одинаковы при любом параметре dpi: (100, 48).
Логические координаты важны, так как они делают поведение операционной системы и приложений согласованным независимо от параметра dpi. Например, System.Windows.Forms.Cursor.Position обычно возвращает логические координаты. При намещении курсора над элементом в диалоговом окне возвращаются одни и те же координаты независимо от параметра dpi. Если вы рисуете элемент управления в (100, 100), он отрисовывается к этим логическим координатам и будет занимать ту же относительную позицию при любом параметре dpi.
Масштабирование в активных клиентах специальных возможностей
Специальные возможности Microsoft Active Не используют логические координаты. Следующие методы и функции либо возвращают физические координаты, либо принимают их в качестве параметров.
По умолчанию клиентское приложение Microsoft Active Accessibility, работающее в среде, отличной от 96 точек на дюйм, не сможет получить правильные результаты из этих вызовов. Например, так как положение курсора находится в логических координатах, клиент не может просто передать эти координаты в AccessibleObjectFromPoint , чтобы получить элемент, который находится под курсором.
Кроме того, приложение, создающее окно за пределами своей клиентской области, например приложение со специальными возможностями, которое выделяет элементы пользовательского интерфейса, не создаст окно в правильном расположении экрана, так как окно будет размещено по логическим координатам, а не по физическим координатам, возвращенным методом IAccessible::accLocation.
Решение состоит из двух частей:
- Сделайте клиентское приложение "с поддержкой dpi". Для этого вызовите функцию SetProcessDPIAware при запуске. Эта функция обеспечивает поддержку dpi для всего процесса, что означает, что все окна, принадлежащие процессу, не масштабируются.
- Используйте функции с поддержкой dpi. Например, чтобы получить координаты курсора, вызовите функцию GetPhysicalCursorPos . Не используйте GetCursorPos; его поведение в приложениях с поддержкой dpi не определено.
Если приложение выполняет прямой обмен данными между процессами с приложениями, не поддерживащими dpi, возможно, вы выполнили преобразование между логическими и физическими координатами с помощью функций PhysicalToLogicalPoint и LogicalToPhysicalPoint .