Поделиться через


Direct2D и высокий DPI

Создание приложения с поддержкой DPI — это ключ к тому, чтобы пользовательский интерфейс выглядел постоянно хорошо в самых разных параметрах дисплея с высоким разрешением. Приложение, которое не поддерживает DPI, но работает с параметром отображения с высоким разрешением, может страдать от множества визуальных артефактов, включая неправильное масштабирование элементов пользовательского интерфейса, обрезанный текст и размытые изображения. Благодаря добавлению в приложение поддержки осведомленности о DPI вы делаете представление пользовательского интерфейса приложения более предсказуемым, что делает его более визуально привлекательным и более удобным для чтения для пользователей. К счастью, Direct2D упрощает написание приложений, которые хорошо работают с высоким разрешением. В этом разделе содержатся следующие подразделы.

Поддержка высокого разрешения в Direct2D

Direct2D предоставляет следующие возможности для работы со сценариями с высоким разрешением:

  • Он автоматически учитывает системный DPI при создании оконного целевого объекта отрисовки, если манифест приложения указывает, что приложение правильно обрабатывает DPI. (Сведения о том, как объявить приложение с поддержкой DPI, см. в статье Как убедиться, что приложение правильно отображается на дисплеях с высоким разрешением.)
  • Он выражает координаты в DIP (независимых от устройства пикселях), что позволяет приложению автоматически масштабироваться при изменении параметра DPI.
  • Он позволяет растровым изображениям иметь значение DPI и правильно масштабирует их, принимая во внимание DPI. Эту функцию также можно использовать для поддержки значков в разных разрешениях.
  • Он выражает большинство ресурсов в DIP, что автоматически делает ресурсы независимыми от разрешения.
  • Он использует координатное пространство с плавающей запятой и сглаживание, поэтому любое содержимое можно масштабировать до любого произвольного DPI.

Графический конвейер Direct2D предназначен для масштабирования с 96 DPI до 1200DPI.

Windows 8 и высокий DPI

Начиная с Windows 8, существуют дополнительные функции для поддержки высокого разрешения.

Если DPI контекста устройства достаточно высок, Direct2D изменяет пороговое значение, которое он использует, чтобы включить вертикальное сглаживание текста. Это ускоряет отрисовку текста на дисплеях с высоким разрешением. Кроме того, можно переключить режим единицы измерения в пиксели вместо DIP с помощью метода ID2D1DeviceContext::SetUnitMode . Если в режиме единицы измерения заданы пиксели, а для контекста устройства — значение DPI экрана, оптимизация по-прежнему включена.

Что такое DIP?

Независимый от устройства пиксель (DIP) — это логический пиксель, который сопоставляется с пикселями физического устройства с помощью скалярного значения DPI. DPI означает точки на дюйм, где точка представляет физический пиксель устройства. (Номенклатура происходит от печати, где точки — это самая маленькая точка рукописного ввода, которую может создать процесс печати). Так как стандартный монитор имел 96 точек на дюйм, то DPI 96 означало, что устройство независимо от пикселя (или DIP) сопоставляется 1:1 с физическим пикселем. Например, если значение DPI равно 96*2 = 192, то один DIP будет охватывать два физических пикселя.

Существует множество причин, по которым приложения не обязательно правильно обрабатывают такое масштабирование. одна из простейших причин заключается в том, что для обнаружения и использования этого скалярного значения при отрисовке требуется дополнительная работа. В Direct2D масштабирование применяется по умолчанию. Из-за этого сопоставления пиксели физических устройств могут оказаться в дробных координатах DIP, что является одной из причин, почему Direct2D использует координатное пространство с плавающей запятой.

физический пиксель = (падение × точек на дюйм) / 96

Чтобы преобразовать физический пиксель в DIP, используйте следующую формулу:

dip = (физический пиксель × 96) / DPI

Примечание

Начиная с Windows 8, с помощью метода ID2D1DeviceContext::SetUnitMode можно переключить режим единицы измерения в пиксели вместо DIP.

 

Как обеспечить правильное отображение приложения на дисплеях с высоким разрешением