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


Direct2D и High-DPI

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

поддержка High-DPI в Direct2D

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

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

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

Windows 8 и High-DPI

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

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

Что такое DIP?

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

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

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

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

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

Заметка

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

 

Как убедиться, что приложение правильно отображается на High-DPI отображает