Sign in Join
Wiki copytemporary

High DPI/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Вступление
22
33DPI (Dots Per Inch) - это соотношение между размером в пикселях и фактическим размером дисплея. Здесь точка является эквивалентом пикселя в терминологии печати. Приложения могут либо использовать размеры в пикселях, либо учитывать фактический размер дисплея. Во втором случае размеры указаны в пунктах.
44
55Большинство современных операционных систем используют значение DPI по умолчанию, установленное в 96, и позволяют вручную изменить его на более высокое значение. Физический DPI можно определить по отображению через протокол [EDID](http://ru.wikipedia.org/wiki/Extended_display_identification_data) по данным физического размера и фактического разрешения. Но физический DPI не используется системой автоматически, поэтому, если вы подключите видеовыход к монитору с другим размером, то разрешение экрана и визуальный размер элементов управления не изменятся автоматически.
66
77Обычно DPI представляется как одно значение, но оно может отличаться для горизонтальной и вертикальной осей, если пиксель не квадратный.
88
99В дополнение к базовому пониманию DPI приложения вы можете добавить в приложение собственные параметры DPI, чтобы пользователи могли настраивать DPI для каждого приложения, чтобы избежать неправильной настройки DPI системы.
1010
1111### Свойства Lazarus, ссылающиеся на DPI
1212
1313- Graphics.ScreenInfo.PixelsPerInchX
1414- Graphics.ScreenInfo.PixelsPerInchY
1515- Forms.Screen.PixelsPerInch
1616- Forms.TForm.DesignTimePPI (См.: [[Autosize / Layout/ru|Автоматическая настройка DPI]])
1717
1818### Пиксели и точки
1919
2020Например, **300 DPI** означает, что на дюйм приходится 300 пикселей (или точек). Есть 72 точки на дюйм, так что:
2121
2222300 пикселей ↔ 1 дюйм
2323
2424300/72 пикселей ↔ 1 точка
2525
26264,16 пикселей ↔ 1 точка
2727
2828**Теперь с 96 DPI:**
2929
303096 пикселей ↔ 1 дюйм
3131
32321,33 пикселя ↔ 1 точка
3333
3434**Теперь с 144 DPI:**
3535
3636144 пикселя ↔ 1 дюйм
3737
38382 пикселя ↔ 1 точка
3939
4040## Настройка High DPI
4141
4242### Windows
4343
4444В Windows 95 и более поздних версиях можно изменить соотношение DPI, чтобы увеличить размер элементов. Высокий DPI означает любую пользовательскую настройку DPI с более чем 96 DPI (настройка по умолчанию) ([ссылка](https://docs.microsoft.com/en-us/windows/desktop/hidpi/high-dpi-desktop-application-development-on-windows)).
4545
4646Высокая осведомленность о DPI означает, что приложение учитывает этот параметр DPI.
4747
4848#### Windows Vista и Windows 7
4949
5050В Windows 7 перейдите в «Панель управления \> Все элементы управления \> Экран».
5151
5252Выберите Мелкий 100% (по умолчанию), Средний 125% или Крупный 150%. Если вы выбираете 100% (96 DPI), это значение по умолчанию для Windows DPI (High DPI не используется по умолчанию).
5353
5454Если вы выбрали 125% (120 DPI), опция «Использовать масштабирование DPI в стиле Windows XP» будет включена. Приложения, которые вы запускаете под этим параметром, масштабируются так, как будто они работают под Windows XP.
5555
5656Если вы выберете 150% (144 DPI), опция «Использовать масштабирование DPI в стиле Windows XP» будет отключена (виртуализация DPI включена), и приложения, которые вы запускаете с этим параметром, должны иметь High DPI Awareness, чтобы предотвратить масштабирование системы, которое приведет к размытию изображения.
5757
5858Вы также можете установить свои собственные настройки DPI с помощью параметра "Set custom text size (DPI)"(Установить собственный размер текста (DPI)) и включить/отключить виртуализацию DPI.
5959
6060#### Windows 8 Metro приложения
6161
6262Для Windows 8 Metro приложения читайте [это](http://blogs.msdn.com/b/b8/archive/2012/03/21/scaling-to-different-screens.aspx).
6363
6464#### Windows 10
6565
6666В Windows 10 «Панель управления \> Оформление и персонализация \> Экран» имеет больше параметров. У вас могут быть разные размеры шрифта для каждого элемента: заголовок, меню, диалоговое окно и т.д. Убедитесь, что вы протестировали дважды для проверки, все ли работает под разными размерами.
6767
6868Теперь \[все\] основана на размере шрифта, а не DPI. Параметр DPI \[использовать\] не рекомендуется, но все же \[он\] есть. Таким образом, вместо изменения размера всех элементов на рабочем столе, это изменит только размер шрифта (и, конечно, все остальное будет изменено для соответствия).
6969
7070Помните, что под Windows 10 есть универсальные приложения (WinRT) и классические настольные приложения (Win32). Мы говорим здесь о настольных приложениях.
7171
7272### Linux
7373
7474В Linux настройка DPI является более сложной и зависит от используемого программного обеспечения и его версии.
7575
7676Вы можете узнать текущее разрешение монитора с помощью команды:
7777
7878``` bash
7979xdpyinfo|grep dots
8080```
8181
8282Вы можете изменить DPI на новое значение командой:
8383
8484``` bash
8585xrandr --dpi 144x144
8686```
8787
8888Чтобы сохранить настройки после перезагрузки, вам нужно добавить команду как скрипт в /etc/X11/Xsession.d/77set_dpi.
8989
9090Дополнительная информация:
9191
9292- [Как найти и изменить DPI экрана?](http://askubuntu.com/questions/197828/how-to-find-and-change-the-screen-dpi) (англ.)
9393- [Размер экрана и DPI](https://wiki.archlinux.org/index.php/xorg#Display_size_and_DPI) (англ.)
9494- [Изменение фиксированных 96dpi на Ubuntu с ЖК-дисплеем с высоким DPI](https://help.ubuntu.com/community/AsusZenbook#LCD) (англ.)
9595
9696## Примеры
9797
9898### Фиксированные размеры шрифта (не HighDPI)
9999
100100Вот форма с неопределенным размером шрифта (установленным в ноль, который является значением по умолчанию). Он был разработан с разрешением 96 точек на дюйм (100%) и выглядит следующим образом:
101101
102-<figure>
103-<img src="Testdpi100.png" title="Testdpi100.png" />
104-<figcaption>Testdpi100.png</figcaption>
105-</figure>
102+![](/wiki-images/7/75/Testdpi100.png)
106103
107104Теперь при 120 DPI (125%) он становится:
108105
109-<figure>
110-<img src="Testdpi125.png" title="Testdpi125.png" />
111-<figcaption>Testdpi125.png</figcaption>
112-</figure>
106+![](/wiki-images/0/03/Testdpi125.png)
113107
114108Как видите, шрифт становится больше, поэтому текст обрезается. Заголовок окна становится больше, но клиентская область окна остается того же размера. Обратите внимание, что эти изменения в размере могут происходить при использовании приложения с другой темой Windows или с другой операционной системой.
115109
116110Чтобы избежать этого, вы должны установить **НЕ**нулевое значение размера шрифта. Обратите внимание, что `Font.Size` выражается в точках, а `Font.Height` выражается в пикселях. Фактически, сохраняется только значение `Font.Height`, а `Font.Size` изменяется в соответствии с текущим значением DPI. Поэтому, если мы установим размер шрифта, он будет зафиксирован до определенного размера в пикселях.
117111
118112Если мы попробуем еще раз с фиксированным размером шрифта 9 точек, то при 96 DPI (100%) мы получим это:
119113
120-<figure>
121-<img src="Testdpi100fixedM12P9.png" title="Testdpi100fixedM12P9.png" />
122-<figcaption>Testdpi100fixedM12P9.png</figcaption>
123-</figure>
114+![](/wiki-images/f/fe/Testdpi100fixedM12P9.png)
124115
125116Теперь, если та же самая программа работает с разрешением 120 точек на дюйм (125%), она становится:
126117
127-<figure>
128-<img src="Testdpi125fixedM12P9.png" title="Testdpi125fixedM12P9.png" />
129-<figcaption>Testdpi125fixedM12P9.png</figcaption>
130-</figure>
118+![](/wiki-images/a/a1/Testdpi125fixedM12P9.png)
131119
132120Результат практически одинаков. Строка заголовка больше, но клиентская область и размер шрифта одинаковы. Обратите внимание, что на самом деле размер шрифта в точках изменился.
133121
134122Вывод из этого заключается в том, что можно избежать несогласованности в отображении, установив размеры шрифта. Но мы не принимаем во внимание, что графические элементы могут быть меньше в соответствии с фактическим DPI экрана. Благодаря поддержке DPI можно заставить приложение вести себя так, как будто оно знает реальный размер пикселей.
135123
136124### Приложения с поддержкой DPI (для Vista +)
137125
138126[CPickSniff](http://sourceforge.net/projects/cpicksniff2/) это приложение для захвата цвета экрана. Мы будем использовать его в качестве примера, чтобы увидеть, как работает High DPI в Windows.
139127
140128**DPI по умолчанию**
141129
142130Это приложение запущено на 96 DPI (100%). Это режим по умолчанию, когда масштабирование не требуется.
143131
144-<figure>
145-<img src="cpicksniff_defaultdpi.png" title="cpicksniff_defaultdpi.png" />
146-<figcaption>cpicksniff_defaultdpi.png</figcaption>
147-</figure>
132+![](/wiki-images/4/4b/Cpicksniff_defaultdpi.png)
148133
149134**Масштабирование DPI Windows**
150135
151136Это то же самое приложение, запущенное под 144 DPI (150%) без манифеста, поэтому Windows масштабирует его как растровое изображение. В результате получается размытое изображение.
152137
153-<figure>
154-<img src="cpicksniff_blured.png" title="cpicksniff_blured.png" />
155-<figcaption>cpicksniff_blured.png</figcaption>
156-</figure>
138+![](/wiki-images/5/54/Cpicksniff_blured.png)
157139
158140**С манифестом**
159141
160142Запущено под 144 DPI (150%). На этот раз приложение содержит манифест, но приложение не содержит кода для обработки масштабирования. Элементы не масштабируются, тогда как шрифты масштабируются (Windows делает это автоматически), поэтому текст обрезается.
161143
162-<figure>
163-<img src="cpicksniff_nohighdpi.png" title="cpicksniff_nohighdpi.png" />
164-<figcaption>cpicksniff_nohighdpi.png</figcaption>
165-</figure>
144+![](/wiki-images/1/1b/Cpicksniff_nohighdpi.png)
166145
167146**High DPI**
168147
169148Наконец, с манифестом и масштабированием LCL, приложение находится в высоком разрешении(High DPI).
170149
171-<figure>
172-<img src="cpicksniff_highdpi.png" title="cpicksniff_highdpi.png" />
173-<figcaption>cpicksniff_highdpi.png</figcaption>
174-</figure>
150+![](/wiki-images/b/bd/Cpicksniff_highdpi.png)
175151
176152## High DPI в Lazarus 1.8 и выше
177153
178154Для обработки High DPI с использованием новых функций в 1.8, выполните следующие действия:
179155
180156- На Windows: включите поддержку DPI в разделе Project Options(Параметры проекта) -\> Application (Приложение). Определитесь, хотите ли вы поддерживать DPI каждого монитора или нет.
181157- Включите масштабирование LCL для поддержки DPI вашей программы в Project Options(Параметры проекта) -\> Application(Приложение) -\> Use LCL scaling (Hi-DPI) (Использовать масштабирование LCL (Hi-DPI)).
182158- Установите `TForm.Scaled=True` для всех ваших форм (это будет значение по умолчанию). Все WYSIWYG-эффекты должны работать автоматически. Также дизайнер соответственно масштабирует формы.
183159- Если вы создаете элементы управления во время выполнения, отмасштабируйте все координаты, размеры и т.д., которые должны учитывать DPI, с помощью `TControl.Scale96ToForm()` или `ScaleDesignToForm()` (в зависимости от выбранного вами PPI по умолчанию) или подготовьте свой контейнер (например, панель с элементами управления) как это было с 96 PPI, а затем вызовите `TControl.AutoAdjustLayout(lapAutoAdjustForDPI, 96, ParentFormOfTheContainer.PixelsPerInch, 0, 0)`;
184160- Если некоторые из ваших компонентов не масштабируют свои внутренние размеры, переопределите `DoAutoAdjustLayout` и отмасштабируйте размеры (см. TToolBar) - это должно быть сделано для всех элементов управления. Если элемент управления LCL пропускает `DoAutoAdjustLayout`, сообщите об этом в mantis(багтрекер) и предоставьте исправление, если можете.
185161
186162### Lazarus IDE high DPI
187163
188164Среда Lazarus IDE поддерживает DPI.
189165
190166## High DPI в старых версиях Lazarus
191167
192168\[Поддержка High DPI работает\] не так хорошо, как в 1.8, но \[она все-таки\] работает, вызывайте при каждом событии OnCreate формы:
193169
194170Self.AutoAdjustLayout(lapAutoAdjustForDPI, 96, Screen.PixelsPerInch, Self.Width, ScaleX(Self.Width, 96));
195171
196172## Внешние ссылки
197173
198174- \[<http://msdn.microsoft.com/en-us/library/dd464646(v=VS.85>).aspx High DPI (Windows)\] MSDN article about High DPI
199175- [Guidelines for scaling](http://msdn.microsoft.com/en-us/library/windows/apps/hh465362) Windows Dev Center - User experience guidelines for scaling Metro style apps
200176- [[Windows Icon]] How to create icons that work with High DPI.
201177
202178---
203179*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).*

Back to history