High DPI/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: High DPI/ru
| Old | New | Line | |
|---|---|---|---|
| 1 | + | ## Вступление | |
| 2 | + | ||
| 3 | + | DPI (Dots Per Inch) - это соотношение между размером в пикселях и фактическим размером дисплея. Здесь точка является эквивалентом пикселя в терминологии печати. Приложения могут либо использовать размеры в пикселях, либо учитывать фактический размер дисплея. Во втором случае размеры указаны в пунктах. | |
| 4 | + | ||
| 5 | + | Большинство современных операционных систем используют значение DPI по умолчанию, установленное в 96, и позволяют вручную изменить его на более высокое значение. Физический DPI можно определить по отображению через протокол [EDID](http://ru.wikipedia.org/wiki/Extended_display_identification_data) по данным физического размера и фактического разрешения. Но физический DPI не используется системой автоматически, поэтому, если вы подключите видеовыход к монитору с другим размером, то разрешение экрана и визуальный размер элементов управления не изменятся автоматически. | |
| 6 | + | ||
| 7 | + | Обычно DPI представляется как одно значение, но оно может отличаться для горизонтальной и вертикальной осей, если пиксель не квадратный. | |
| 8 | + | ||
| 9 | + | В дополнение к базовому пониманию DPI приложения вы можете добавить в приложение собственные параметры DPI, чтобы пользователи могли настраивать DPI для каждого приложения, чтобы избежать неправильной настройки DPI системы. | |
| 10 | + | ||
| 11 | + | ### Свойства Lazarus, ссылающиеся на DPI | |
| 12 | + | ||
| 13 | + | - Graphics.ScreenInfo.PixelsPerInchX | |
| 14 | + | - Graphics.ScreenInfo.PixelsPerInchY | |
| 15 | + | - Forms.Screen.PixelsPerInch | |
| 16 | + | - Forms.TForm.DesignTimePPI (См.: [[Autosize / Layout/ru|Автоматическая настройка DPI]]) | |
| 17 | + | ||
| 18 | + | ### Пиксели и точки | |
| 19 | + | ||
| 20 | + | Например, **300 DPI** означает, что на дюйм приходится 300 пикселей (или точек). Есть 72 точки на дюйм, так что: | |
| 21 | + | ||
| 22 | + | 300 пикселей ↔ 1 дюйм | |
| 23 | + | ||
| 24 | + | 300/72 пикселей ↔ 1 точка | |
| 25 | + | ||
| 26 | + | 4,16 пикселей ↔ 1 точка | |
| 27 | + | ||
| 28 | + | **Теперь с 96 DPI:** | |
| 29 | + | ||
| 30 | + | 96 пикселей ↔ 1 дюйм | |
| 31 | + | ||
| 32 | + | 1,33 пикселя ↔ 1 точка | |
| 33 | + | ||
| 34 | + | **Теперь с 144 DPI:** | |
| 35 | + | ||
| 36 | + | 144 пикселя ↔ 1 дюйм | |
| 37 | + | ||
| 38 | + | 2 пикселя ↔ 1 точка | |
| 39 | + | ||
| 40 | + | ## Настройка High DPI | |
| 41 | + | ||
| 42 | + | ### Windows | |
| 43 | + | ||
| 44 | + | В Windows 95 и более поздних версиях можно изменить соотношение DPI, чтобы увеличить размер элементов. Высокий DPI означает любую пользовательскую настройку DPI с более чем 96 DPI (настройка по умолчанию) ([ссылка](https://docs.microsoft.com/en-us/windows/desktop/hidpi/high-dpi-desktop-application-development-on-windows)). | |
| 45 | + | ||
| 46 | + | Высокая осведомленность о DPI означает, что приложение учитывает этот параметр DPI. | |
| 47 | + | ||
| 48 | + | #### Windows Vista и Windows 7 | |
| 49 | + | ||
| 50 | + | В Windows 7 перейдите в «Панель управления \> Все элементы управления \> Экран». | |
| 51 | + | ||
| 52 | + | Выберите Мелкий 100% (по умолчанию), Средний 125% или Крупный 150%. Если вы выбираете 100% (96 DPI), это значение по умолчанию для Windows DPI (High DPI не используется по умолчанию). | |
| 53 | + | ||
| 54 | + | Если вы выбрали 125% (120 DPI), опция «Использовать масштабирование DPI в стиле Windows XP» будет включена. Приложения, которые вы запускаете под этим параметром, масштабируются так, как будто они работают под Windows XP. | |
| 55 | + | ||
| 56 | + | Если вы выберете 150% (144 DPI), опция «Использовать масштабирование DPI в стиле Windows XP» будет отключена (виртуализация DPI включена), и приложения, которые вы запускаете с этим параметром, должны иметь High DPI Awareness, чтобы предотвратить масштабирование системы, которое приведет к размытию изображения. | |
| 57 | + | ||
| 58 | + | Вы также можете установить свои собственные настройки DPI с помощью параметра "Set custom text size (DPI)"(Установить собственный размер текста (DPI)) и включить/отключить виртуализацию DPI. | |
| 59 | + | ||
| 60 | + | #### Windows 8 Metro приложения | |
| 61 | + | ||
| 62 | + | Для Windows 8 Metro приложения читайте [это](http://blogs.msdn.com/b/b8/archive/2012/03/21/scaling-to-different-screens.aspx). | |
| 63 | + | ||
| 64 | + | #### Windows 10 | |
| 65 | + | ||
| 66 | + | В Windows 10 «Панель управления \> Оформление и персонализация \> Экран» имеет больше параметров. У вас могут быть разные размеры шрифта для каждого элемента: заголовок, меню, диалоговое окно и т.д. Убедитесь, что вы протестировали дважды для проверки, все ли работает под разными размерами. | |
| 67 | + | ||
| 68 | + | Теперь \[все\] основана на размере шрифта, а не DPI. Параметр DPI \[использовать\] не рекомендуется, но все же \[он\] есть. Таким образом, вместо изменения размера всех элементов на рабочем столе, это изменит только размер шрифта (и, конечно, все остальное будет изменено для соответствия). | |
| 69 | + | ||
| 70 | + | Помните, что под Windows 10 есть универсальные приложения (WinRT) и классические настольные приложения (Win32). Мы говорим здесь о настольных приложениях. | |
| 71 | + | ||
| 72 | + | ### Linux | |
| 73 | + | ||
| 74 | + | В Linux настройка DPI является более сложной и зависит от используемого программного обеспечения и его версии. | |
| 75 | + | ||
| 76 | + | Вы можете узнать текущее разрешение монитора с помощью команды: | |
| 77 | + | ||
| 78 | + | ``` bash | |
| 79 | + | xdpyinfo|grep dots | |
| 80 | + | ``` | |
| 81 | + | ||
| 82 | + | Вы можете изменить DPI на новое значение командой: | |
| 83 | + | ||
| 84 | + | ``` bash | |
| 85 | + | xrandr --dpi 144x144 | |
| 86 | + | ``` | |
| 87 | + | ||
| 88 | + | Чтобы сохранить настройки после перезагрузки, вам нужно добавить команду как скрипт в /etc/X11/Xsession.d/77set_dpi. | |
| 89 | + | ||
| 90 | + | Дополнительная информация: | |
| 91 | + | ||
| 92 | + | - [Как найти и изменить DPI экрана?](http://askubuntu.com/questions/197828/how-to-find-and-change-the-screen-dpi) (англ.) | |
| 93 | + | - [Размер экрана и DPI](https://wiki.archlinux.org/index.php/xorg#Display_size_and_DPI) (англ.) | |
| 94 | + | - [Изменение фиксированных 96dpi на Ubuntu с ЖК-дисплеем с высоким DPI](https://help.ubuntu.com/community/AsusZenbook#LCD) (англ.) | |
| 95 | + | ||
| 96 | + | ## Примеры | |
| 97 | + | ||
| 98 | + | ### Фиксированные размеры шрифта (не HighDPI) | |
| 99 | + | ||
| 100 | + | Вот форма с неопределенным размером шрифта (установленным в ноль, который является значением по умолчанию). Он был разработан с разрешением 96 точек на дюйм (100%) и выглядит следующим образом: | |
| 101 | + | ||
| 102 | + | <figure> | |
| 103 | + | <img src="Testdpi100.png" title="Testdpi100.png" /> | |
| 104 | + | <figcaption>Testdpi100.png</figcaption> | |
| 105 | + | </figure> | |
| 106 | + | ||
| 107 | + | Теперь при 120 DPI (125%) он становится: | |
| 108 | + | ||
| 109 | + | <figure> | |
| 110 | + | <img src="Testdpi125.png" title="Testdpi125.png" /> | |
| 111 | + | <figcaption>Testdpi125.png</figcaption> | |
| 112 | + | </figure> | |
| 113 | + | ||
| 114 | + | Как видите, шрифт становится больше, поэтому текст обрезается. Заголовок окна становится больше, но клиентская область окна остается того же размера. Обратите внимание, что эти изменения в размере могут происходить при использовании приложения с другой темой Windows или с другой операционной системой. | |
| 115 | + | ||
| 116 | + | Чтобы избежать этого, вы должны установить **НЕ**нулевое значение размера шрифта. Обратите внимание, что `Font.Size` выражается в точках, а `Font.Height` выражается в пикселях. Фактически, сохраняется только значение `Font.Height`, а `Font.Size` изменяется в соответствии с текущим значением DPI. Поэтому, если мы установим размер шрифта, он будет зафиксирован до определенного размера в пикселях. | |
| 117 | + | ||
| 118 | + | Если мы попробуем еще раз с фиксированным размером шрифта 9 точек, то при 96 DPI (100%) мы получим это: | |
| 119 | + | ||
| 120 | + | <figure> | |
| 121 | + | <img src="Testdpi100fixedM12P9.png" title="Testdpi100fixedM12P9.png" /> | |
| 122 | + | <figcaption>Testdpi100fixedM12P9.png</figcaption> | |
| 123 | + | </figure> | |
| 124 | + | ||
| 125 | + | Теперь, если та же самая программа работает с разрешением 120 точек на дюйм (125%), она становится: | |
| 126 | + | ||
| 127 | + | <figure> | |
| 128 | + | <img src="Testdpi125fixedM12P9.png" title="Testdpi125fixedM12P9.png" /> | |
| 129 | + | <figcaption>Testdpi125fixedM12P9.png</figcaption> | |
| 130 | + | </figure> | |
| 131 | + | ||
| 132 | + | Результат практически одинаков. Строка заголовка больше, но клиентская область и размер шрифта одинаковы. Обратите внимание, что на самом деле размер шрифта в точках изменился. | |
| 133 | + | ||
| 134 | + | Вывод из этого заключается в том, что можно избежать несогласованности в отображении, установив размеры шрифта. Но мы не принимаем во внимание, что графические элементы могут быть меньше в соответствии с фактическим DPI экрана. Благодаря поддержке DPI можно заставить приложение вести себя так, как будто оно знает реальный размер пикселей. | |
| 135 | + | ||
| 136 | + | ### Приложения с поддержкой DPI (для Vista +) | |
| 137 | + | ||
| 138 | + | [CPickSniff](http://sourceforge.net/projects/cpicksniff2/) это приложение для захвата цвета экрана. Мы будем использовать его в качестве примера, чтобы увидеть, как работает High DPI в Windows. | |
| 139 | + | ||
| 140 | + | **DPI по умолчанию** | |
| 141 | + | ||
| 142 | + | Это приложение запущено на 96 DPI (100%). Это режим по умолчанию, когда масштабирование не требуется. | |
| 143 | + | ||
| 144 | + | <figure> | |
| 145 | + | <img src="cpicksniff_defaultdpi.png" title="cpicksniff_defaultdpi.png" /> | |
| 146 | + | <figcaption>cpicksniff_defaultdpi.png</figcaption> | |
| 147 | + | </figure> | |
| 148 | + | ||
| 149 | + | **Масштабирование DPI Windows** | |
| 150 | + | ||
| 151 | + | Это то же самое приложение, запущенное под 144 DPI (150%) без манифеста, поэтому Windows масштабирует его как растровое изображение. В результате получается размытое изображение. | |
| 152 | + | ||
| 153 | + | <figure> | |
| 154 | + | <img src="cpicksniff_blured.png" title="cpicksniff_blured.png" /> | |
| 155 | + | <figcaption>cpicksniff_blured.png</figcaption> | |
| 156 | + | </figure> | |
| 157 | + | ||
| 158 | + | **С манифестом** | |
| 159 | + | ||
| 160 | + | Запущено под 144 DPI (150%). На этот раз приложение содержит манифест, но приложение не содержит кода для обработки масштабирования. Элементы не масштабируются, тогда как шрифты масштабируются (Windows делает это автоматически), поэтому текст обрезается. | |
| 161 | + | ||
| 162 | + | <figure> | |
| 163 | + | <img src="cpicksniff_nohighdpi.png" title="cpicksniff_nohighdpi.png" /> | |
| 164 | + | <figcaption>cpicksniff_nohighdpi.png</figcaption> | |
| 165 | + | </figure> | |
| 166 | + | ||
| 167 | + | **High DPI** | |
| 168 | + | ||
| 169 | + | Наконец, с манифестом и масштабированием LCL, приложение находится в высоком разрешении(High DPI). | |
| 170 | + | ||
| 171 | + | <figure> | |
| 172 | + | <img src="cpicksniff_highdpi.png" title="cpicksniff_highdpi.png" /> | |
| 173 | + | <figcaption>cpicksniff_highdpi.png</figcaption> | |
| 174 | + | </figure> | |
| 175 | + | ||
| 176 | + | ## High DPI в Lazarus 1.8 и выше | |
| 177 | + | ||
| 178 | + | Для обработки High DPI с использованием новых функций в 1.8, выполните следующие действия: | |
| 179 | + | ||
| 180 | + | - На Windows: включите поддержку DPI в разделе Project Options(Параметры проекта) -\> Application (Приложение). Определитесь, хотите ли вы поддерживать DPI каждого монитора или нет. | |
| 181 | + | - Включите масштабирование LCL для поддержки DPI вашей программы в Project Options(Параметры проекта) -\> Application(Приложение) -\> Use LCL scaling (Hi-DPI) (Использовать масштабирование LCL (Hi-DPI)). | |
| 182 | + | - Установите `TForm.Scaled=True` для всех ваших форм (это будет значение по умолчанию). Все WYSIWYG-эффекты должны работать автоматически. Также дизайнер соответственно масштабирует формы. | |
| 183 | + | - Если вы создаете элементы управления во время выполнения, отмасштабируйте все координаты, размеры и т.д., которые должны учитывать DPI, с помощью `TControl.Scale96ToForm()` или `ScaleDesignToForm()` (в зависимости от выбранного вами PPI по умолчанию) или подготовьте свой контейнер (например, панель с элементами управления) как это было с 96 PPI, а затем вызовите `TControl.AutoAdjustLayout(lapAutoAdjustForDPI, 96, ParentFormOfTheContainer.PixelsPerInch, 0, 0)`; | |
| 184 | + | - Если некоторые из ваших компонентов не масштабируют свои внутренние размеры, переопределите `DoAutoAdjustLayout` и отмасштабируйте размеры (см. TToolBar) - это должно быть сделано для всех элементов управления. Если элемент управления LCL пропускает `DoAutoAdjustLayout`, сообщите об этом в mantis(багтрекер) и предоставьте исправление, если можете. | |
| 185 | + | ||
| 186 | + | ### Lazarus IDE high DPI | |
| 187 | + | ||
| 188 | + | Среда Lazarus IDE поддерживает DPI. | |
| 189 | + | ||
| 190 | + | ## High DPI в старых версиях Lazarus | |
| 191 | + | ||
| 192 | + | \[Поддержка High DPI работает\] не так хорошо, как в 1.8, но \[она все-таки\] работает, вызывайте при каждом событии OnCreate формы: | |
| 193 | + | ||
| 194 | + | Self.AutoAdjustLayout(lapAutoAdjustForDPI, 96, Screen.PixelsPerInch, Self.Width, ScaleX(Self.Width, 96)); | |
| 195 | + | ||
| 196 | + | ## Внешние ссылки | |
| 197 | + | ||
| 198 | + | - \[<http://msdn.microsoft.com/en-us/library/dd464646(v=VS.85>).aspx High DPI (Windows)\] MSDN article about High DPI | |
| 199 | + | - [Guidelines for scaling](http://msdn.microsoft.com/en-us/library/windows/apps/hh465362) Windows Dev Center - User experience guidelines for scaling Metro style apps | |
| 200 | + | - [[Windows Icon]] How to create icons that work with High DPI. | |
| 201 | + | ||
| 202 | + | --- | |
| 203 | + | *From the Free Pascal wiki, page "High DPI/ru", as it stood on 2022-06-22 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
