High DPI/ru

From Free Pascal wiki

Deutsch (de) English (en) español (es) русский (ru)

Вступление

DPI (Dots Per Inch) - это соотношение между размером в пикселях и фактическим размером дисплея. Здесь точка является эквивалентом пикселя в терминологии печати. Приложения могут либо использовать размеры в пикселях, либо учитывать фактический размер дисплея. Во втором случае размеры указаны в пунктах.

Большинство современных операционных систем используют значение DPI по умолчанию, установленное в 96, и позволяют вручную изменить его на более высокое значение. Физический DPI можно определить по отображению через протокол EDID по данным физического размера и фактического разрешения. Но физический DPI не используется системой автоматически, поэтому, если вы подключите видеовыход к монитору с другим размером, то разрешение экрана и визуальный размер элементов управления не изменятся автоматически.

Обычно DPI представляется как одно значение, но оно может отличаться для горизонтальной и вертикальной осей, если пиксель не квадратный.

В дополнение к базовому пониманию DPI приложения вы можете добавить в приложение собственные параметры DPI, чтобы пользователи могли настраивать DPI для каждого приложения, чтобы избежать неправильной настройки DPI системы.

Свойства Lazarus, ссылающиеся на DPI


Пиксели и точки

Например, 300 DPI означает, что на дюйм приходится 300 пикселей (или точек). Есть 72 точки на дюйм, так что:

300 пикселей ↔ 1 дюйм

300/72 пикселей ↔ 1 точка

4,16 пикселей ↔ 1 точка

Теперь с 96 DPI:

96 пикселей ↔ 1 дюйм

1,33 пикселя ↔ 1 дюйм

Теперь с 144 DPI:

144 пикселя ↔ 1 дюйм

2 пикселя ↔ 1 точка

Настройка High DPI

Windows

В Windows 95 и более поздних версиях можно изменить соотношение DPI, чтобы увеличить размер элементов. Высокий DPI означает любую пользовательскую настройку DPI с более чем 96 DPI (настройка по умолчанию) (ссылка).

Высокая осведомленность о DPI означает, что приложение учитывает этот параметр DPI.

Windows Vista и Windows 7

В Windows 7 перейдите в «Панель управления > Все элементы управления > Экран».

Выберите Мелкий 100% (по умолчанию), Средний 125% или Крупный 150%. Если вы выбираете 100% (96 DPI), это значение по умолчанию для Windows DPI (High DPI не используется по умолчанию).

Если вы выбрали 125% (120 DPI), опция «Использовать масштабирование DPI в стиле Windows XP» будет включена. Приложения, которые вы запускаете под этим параметром, масштабируются так, как будто они работают под Windows XP.

Если вы выберете 150% (144 DPI), опция «Использовать масштабирование DPI в стиле Windows XP» будет отключена (виртуализация DPI включена), и приложения, которые вы запускаете с этим параметром, должны иметь High DPI Awareness, чтобы предотвратить масштабирование системы, которое приведет к размытию изображения.

Вы также можете установить свои собственные настройки DPI с помощью параметра "Set custom text size (DPI)"(Установить собственный размер текста (DPI)) и включить/отключить виртуализацию DPI.

Windows 8 Metro приложения

Для Windows 8 Metro приложения читайте это.

Windows 10

В Windows 10 «Панель управления > Оформление и персонализация > Экран» имеет больше параметров. У вас могут быть разные размеры шрифта для каждого элемента: заголовок, меню, диалоговое окно и т.д. Убедитесь, что вы протестировали дважды для проверки, все ли работает под разными размерами.

Теперь [все] основана на размере шрифта, а не DPI. Параметр DPI [использовать] не рекомендуется, но все же [он] есть. Таким образом, вместо изменения размера всех элементов на рабочем столе, это изменит только размер шрифта (и, конечно, все остальное будет изменено для соответствия).

Помните, что под Windows 10 есть универсальные приложения (WinRT) и классические настольные приложения (Win32). Мы говорим здесь о настольных приложениях.

Linux

В Linux настройка DPI является более сложной и зависит от используемого программного обеспечения и его версии.

Вы можете узнать текущее разрешение монитора с помощью команды:

xdpyinfo|grep dots

Вы можете изменить DPI на новое значение командой:

xrandr --dpi 144x144

Чтобы сохранить настройки после перезагрузки, вам нужно добавить команду как скрипт в /etc/X11/Xsession.d/77set_dpi.

Дополнительная информация:

Примеры

Фиксированные размеры шрифта (не HighDPI)

Вот форма с неопределенным размером шрифта (установленным в ноль, который является значением по умолчанию). Он был разработан с разрешением 96 точек на дюйм (100%) и выглядит следующим образом:

Testdpi100.png

Теперь при 120 DPI (125%) он становится:

Testdpi125.png

Как видите, шрифт становится больше, поэтому текст обрезается. Заголовок окна становится больше, но клиентская область окна остается того же размера. Обратите внимание, что эти изменения в размере могут происходить при использовании приложения с другой темой Windows или с другой операционной системой.

Чтобы избежать этого, вы должны установить НЕнулевое значение размера шрифта. Обратите внимание, что Font.Size выражается в точках, а Font.Height выражается в пикселях. Фактически, сохраняется только значение Font.Height, а Font.Size изменяется в соответствии с текущим значением DPI. Поэтому, если мы установим размер шрифта, он будет зафиксирован до определенного размера в пикселях.

Если мы попробуем еще раз с фиксированным размером шрифта 9 точек, то при 96 DPI (100%) мы получим это:

Testdpi100fixedM12P9.png

Теперь, если та же самая программа работает с разрешением 120 точек на дюйм (125%), она становится:

Testdpi125fixedM12P9.png

Результат практически одинаков. Строка заголовка больше, но клиентская область и размер шрифта одинаковы. Обратите внимание, что на самом деле размер шрифта в точках изменился.

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

Приложения с поддержкой DPI (для Vista +)

CPickSniff это приложение для захвата цвета экрана. Мы будем использовать его в качестве примера, чтобы увидеть, как работает High DPI в Windows.


DPI по умолчанию

Это приложение запущено на 96 DPI (100%). Это режим по умолчанию, когда масштабирование не требуется.

cpicksniff defaultdpi.png


Масштабирование DPI Windows

Это то же самое приложение, запущенное под 144 DPI (150%) без манифеста, поэтому Windows масштабирует его как растровое изображение. В результате получается размытое изображение.

cpicksniff blured.png


С манифестом

Запущено под 144 DPI (150%). На этот раз приложение содержит манифест, но приложение не содержит кода для обработки масштабирования. Элементы не масштабируются, тогда как шрифты масштабируются (Windows делает это автоматически), поэтому текст обрезается.

cpicksniff nohighdpi.png


High DPI

Наконец, с манифестом и масштабированием LCL, приложение находится в высоком разрешении(High DPI).

cpicksniff highdpi.png

High DPI в Lazarus 1.8 и выше

Для обработки High DPI с использованием новых функций в 1.8, выполните следующие действия:

  • На Windows: включите поддержку DPI в разделе Project Options(Параметры проекта) -> Application (Приложение). Определитесь, хотите ли вы поддерживать DPI каждого монитора или нет.
  • Включите масштабирование LCL для поддержки DPI вашей программы в Project Options(Параметры проекта) -> Application(Приложение) -> Use LCL scaling (Hi-DPI) (Использовать масштабирование LCL (Hi-DPI)).
  • Установите TForm.Scaled=True для всех ваших форм (это будет значение по умолчанию). Все WYSIWYG-эффекты должны работать автоматически. Также дизайнер соответственно масштабирует формы.
  • Если вы создаете элементы управления во время выполнения, отмасштабируйте все координаты, размеры и т.д., которые должны учитывать DPI, с помощью TControl.Scale96ToForm() или ScaleDesignToForm() (в зависимости от выбранного вами PPI по умолчанию) или подготовьте свой контейнер (например, панель с элементами управления) как это было с 96 PPI, а затем вызовите TControl.AutoAdjustLayout(lapAutoAdjustForDPI, 96, ParentFormOfTheContainer.PixelsPerInch, 0, 0);
  • Если некоторые из ваших компонентов не масштабируют свои внутренние размеры, переопределите DoAutoAdjustLayout и отмасштабируйте размеры (см. TToolBar) - это должно быть сделано для всех элементов управления. Если элемент управления LCL пропускает DoAutoAdjustLayout, сообщите об этом в mantis(багтрекер) и предоставьте исправление, если можете.

Lazarus IDE high DPI

Среда Lazarus IDE поддерживает DPI.

High DPI в старых версиях Lazarus

[Поддержка High DPI работает] не так хорошо, как в 1.8, но [она все-таки] работает, вызывайте при каждом событии OnCreate формы:

Self.AutoAdjustLayout(lapAutoAdjustForDPI, 96, Screen.PixelsPerInch, Self.Width, ScaleX(Self.Width, 96));

Внешние ссылки