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