Difference between revisions of "High DPI/ru"

From Free Pascal wiki
Jump to navigationJump to search
(9 intermediate revisions by the same user not shown)
Line 74: Line 74:
 
=== Linux ===
 
=== Linux ===
  
On Linux DPI setting is more complicated and depends on used software and their version.  
+
В Linux настройка DPI является более сложной и зависит от используемого программного обеспечения и его версии.
  
You can discover your current monitor DPI by command:
+
Вы можете узнать текущее разрешение монитора с помощью команды:
 
<syntaxhighlight lang="bash">xdpyinfo|grep dots </syntaxhighlight>
 
<syntaxhighlight lang="bash">xdpyinfo|grep dots </syntaxhighlight>
  
You can change DPI to new value by command:
+
Вы можете изменить DPI на новое значение командой:
 
<syntaxhighlight lang="bash">xrandr --dpi 144x144</syntaxhighlight>
 
<syntaxhighlight lang="bash">xrandr --dpi 144x144</syntaxhighlight>
  
To preserve setting after reboot you need to add the command as script to /etc/X11/Xsession.d/77set_dpi.
+
Чтобы сохранить настройки после перезагрузки, вам нужно добавить команду как скрипт в /etc/X11/Xsession.d/77set_dpi.
  
More information:
+
Дополнительная информация:
* [http://askubuntu.com/questions/197828/how-to-find-and-change-the-screen-dpi How to find and change the screen DPI?]
+
* [http://askubuntu.com/questions/197828/how-to-find-and-change-the-screen-dpi Как найти и изменить DPI экрана?] (англ.)
* [https://wiki.archlinux.org/index.php/xorg#Display_size_and_DPI Xorg Display size and DPI]
+
* [https://wiki.archlinux.org/index.php/xorg#Display_size_and_DPI Размер экрана и DPI] (англ.)
* [https://help.ubuntu.com/community/AsusZenbook#LCD Change fixed 96dpi on Ubuntu with high DPI LCD]
+
* [https://help.ubuntu.com/community/AsusZenbook#LCD Изменение фиксированных 96dpi на Ubuntu с ЖК-дисплеем с высоким DPI] (англ.)
  
== Examples ==
+
== Примеры ==
  
=== Fixed Font Sizes (not HighDPI) ===
+
=== Фиксированные размеры шрифта (не HighDPI) ===
  
Here is a form with an undefined font size (set to zero, which is the default value). It has been designed at 96 DPI (100%), and it looks like this :
+
Вот форма с неопределенным размером шрифта (установленным в ноль, который является значением по умолчанию). Он был разработан с разрешением 96 точек на дюйм (100%) и выглядит следующим образом:
  
 
[[Image:Testdpi100.png]]
 
[[Image:Testdpi100.png]]
  
Now, at 120 DPI (125%), it becomes :
+
Теперь при 120 DPI (125%) он становится:
  
 
[[Image:Testdpi125.png]]
 
[[Image:Testdpi125.png]]
  
As you can see, the font gets bigger and so the text is clipped. The window title gets bigger, but the client area of the window remains the same size. Note that these changes in size can occur by using an application with a different Windows theme, or with another operating system.
+
Как видите, шрифт становится больше, поэтому текст обрезается. Заголовок окна становится больше, но клиентская область окна остается того же размера. Обратите внимание, что эти изменения в размере могут происходить при использовании приложения с другой темой Windows или с другой операционной системой.
  
To avoid this, you must set the font size to a non-zero value. Note that Font.Size is expressed in points and Font.Height is expressed in pixels. In fact, only the value of Font.Height is stored, and Font.Size changes according to current DPI value. So if we set the font size, it will be fixed to a certain size in pixels.
+
Чтобы избежать этого, вы должны установить '''НЕ'''нулевое значение размера шрифта. Обратите внимание, что <tt>Font.Size</tt> выражается в точках, а <tt>Font.Height</tt> выражается в пикселях. Фактически, сохраняется только значение <tt>Font.Height</tt>, а <tt>Font.Size</tt> изменяется в соответствии с текущим значением DPI. Поэтому, если мы установим размер шрифта, он будет зафиксирован до определенного размера в пикселях.
  
If we try again with a fixed font size of 9 points, then at 96 DPI (100%), we get this :
+
Если мы попробуем еще раз с фиксированным размером шрифта 9 точек, то при 96 DPI (100%) мы получим это:
  
 
[[Image:Testdpi100fixedM12P9.png]]
 
[[Image:Testdpi100fixedM12P9.png]]
  
Now if the same program is run at 120 DPI (125%), it becomes :
+
Теперь, если та же самая программа работает с разрешением 120 точек на дюйм (125%), она становится:
  
 
[[Image:Testdpi125fixedM12P9.png]]
 
[[Image:Testdpi125fixedM12P9.png]]
  
The result is the almost the same. The title bar is bigger, but the client area and the font size is the same. Note that in fact, the size in points of the font has changed.
+
Результат практически одинаков. Строка заголовка больше, но клиентская область и размер шрифта одинаковы. Обратите внимание, что на самом деле размер шрифта в точках изменился.
  
The conclusion from this is that it is possible to avoid inconsistency in the display by fixing font sizes. But we do not take into account that the graphical elements may be smaller according to actual DPI of the screen. With DPI awareness, it is possible to make an application behave as if it knew the real size of the pixels.
+
Вывод из этого заключается в том, что можно избежать несогласованности в отображении, установив размеры шрифта. Но мы не принимаем во внимание, что графические элементы могут быть меньше в соответствии с фактическим DPI экрана. Благодаря поддержке DPI можно заставить приложение вести себя так, как будто оно знает реальный размер пикселей.
  
 +
=== Приложения с поддержкой DPI (для Vista +) ===
  
=== DPI Aware Application (For Vista +) ===
+
[http://sourceforge.net/projects/cpicksniff2/ CPickSniff] это приложение для захвата цвета экрана. Мы будем использовать его в качестве примера, чтобы увидеть, как работает High DPI в Windows.
  
[http://sourceforge.net/projects/cpicksniff2/ CPickSniff] is an application to capture screen colors. We will use it as an example to see how High DPI works in Windows.
 
  
'''Default DPI'''
+
'''DPI по умолчанию'''
  
This is the app running at 96 DPI (100%). It's the default mode, when scaling isn't necessary.
+
Это приложение запущено на 96 DPI (100%). Это режим по умолчанию, когда масштабирование не требуется.
  
 
[[Image:cpicksniff_defaultdpi.png]]
 
[[Image:cpicksniff_defaultdpi.png]]
  
'''Windows DPI Scaling'''
 
  
This is the same app running at 144 DPI (150%) without a manifest, so Windows scales it like a bitmap. The result is a blurred image.
+
'''Масштабирование DPI Windows'''
 +
 
 +
Это то же самое приложение, запущенное под 144 DPI (150%) без манифеста, поэтому Windows масштабирует его как растровое изображение. В результате получается размытое изображение.
  
 
[[Image:cpicksniff_blured.png]]
 
[[Image:cpicksniff_blured.png]]
  
'''With Manifest'''
 
  
Running at 144 DPI (150%). This time the app includes a manifest but the application contains no code to handle scaling. Items aren't scaled whereas fonts are scaled (Windows does this automatically), so text is clipped.
+
'''С манифестом'''
 +
 
 +
Запущено под 144 DPI (150%). На этот раз приложение содержит манифест, но приложение не содержит кода для обработки масштабирования. Элементы не масштабируются, тогда как шрифты масштабируются (Windows делает это автоматически), поэтому текст обрезается.
  
 
[[Image:cpicksniff_nohighdpi.png]]
 
[[Image:cpicksniff_nohighdpi.png]]
 +
  
 
'''High DPI'''
 
'''High DPI'''
  
Finally with both a manifest and a LCL scaling, the app is in High DPI.
+
Наконец, с манифестом и масштабированием LCL, приложение находится в высоком разрешении(High DPI).
  
 
[[Image:cpicksniff_highdpi.png]]
 
[[Image:cpicksniff_highdpi.png]]
  
== High DPI in Lazarus 1.8 and above ==
+
== High DPI в Lazarus 1.8 и выше ==
  
To handle High DPI using new features in 1.8, follow these steps:
+
Для обработки High DPI с использованием новых функций в 1.8, выполните следующие действия:
  
* On Windows: enable DPI awareness in Project Options -> Application. Decide if you want to support per monitor DPI awareness or not.
+
* На Windows: включите поддержку DPI в разделе Project Options(Параметры проекта) -> Application (Приложение). Определитесь, хотите ли вы поддерживать DPI каждого монитора или нет.
* Enable LCL scaling for your application DPI awareness in Project Options -> Application -> "Use LCL scaling (Hi-DPI).
+
* Включите масштабирование LCL для поддержки DPI вашей программы в Project Options(Параметры проекта) -> Application(Приложение) -> Use LCL scaling (Hi-DPI) (Использовать масштабирование LCL (Hi-DPI)).
* Set TForm.Scaled=True for all your forms (it is the default value). All WYSIWYG should work automatically. Also the designer scales the forms accordingly.
+
* Установите <tt>TForm.Scaled=True</tt> для всех ваших форм (это будет значение по умолчанию). Все WYSIWYG-эффекты должны работать автоматически. Также дизайнер соответственно масштабирует формы.
* If you create controls run-time, scale all coordinates, sizes etc that have to be DPI-aware with TControl.Scale96ToForm() or ScaleDesignToForm() (depending on your choice of default PPI) or prepare your container (e.g. panel with controls) as it was with 96 PPI and then call TControl.AutoAdjustLayout(lapAutoAdjustForDPI, 96, ParentFormOfTheContainer.PixelsPerInch, 0, 0);
+
* Если вы создаете элементы управления во время выполнения, отмасштабируйте все координаты, размеры и т.д., которые должны учитывать DPI, с помощью <tt>TControl.Scale96ToForm()</tt> или <tt>ScaleDesignToForm()</tt> (в зависимости от выбранного вами PPI по умолчанию) или подготовьте свой контейнер (например, панель с элементами управления) как это было с 96 PPI, а затем вызовите <tt>TControl.AutoAdjustLayout(lapAutoAdjustForDPI, 96, ParentFormOfTheContainer.PixelsPerInch, 0, 0)</tt>;
* If some of your components don't scale their inner sizes, override DoAutoAdjustLayout and scale the sizes (see TToolBar) - it has to be done for all controls. If a LCL control misses DoAutoAdjustLayout please report to mantis and provide a patch if you can.
+
* Если некоторые из ваших компонентов не масштабируют свои внутренние размеры, переопределите <tt>DoAutoAdjustLayout</tt> и отмасштабируйте размеры (см. TToolBar) - это должно быть сделано для всех элементов управления. Если элемент управления LCL пропускает <tt>DoAutoAdjustLayout</tt>, сообщите об этом в mantis(багтрекер) и предоставьте исправление, если можете.
  
 
=== Lazarus IDE high DPI ===
 
=== Lazarus IDE high DPI ===
  
The Lazarus IDE is DPI-aware itself.
+
Среда Lazarus IDE поддерживает DPI.
  
== High DPI in older Lazarus ==
+
== High DPI в старых версиях Lazarus ==
  
Is not as nice as 1.8 but it works, call on each form OnCreate event:
+
[Поддержка High DPI работает] не так хорошо, как в 1.8, но [она все-таки] работает, вызывайте при каждом событии OnCreate формы:
  
 
Self.AutoAdjustLayout(lapAutoAdjustForDPI, 96, Screen.PixelsPerInch, Self.Width, ScaleX(Self.Width, 96));
 
Self.AutoAdjustLayout(lapAutoAdjustForDPI, 96, Screen.PixelsPerInch, Self.Width, ScaleX(Self.Width, 96));
  
== External Links ==
+
== Внешние ссылки ==
  
 
* [http://msdn.microsoft.com/en-us/library/dd464646(v=VS.85).aspx High DPI (Windows)] MSDN article about High DPI
 
* [http://msdn.microsoft.com/en-us/library/dd464646(v=VS.85).aspx High DPI (Windows)] MSDN article about High DPI
 
* [http://msdn.microsoft.com/en-us/library/windows/apps/hh465362 Guidelines for scaling] Windows Dev Center - User experience guidelines for scaling Metro style apps
 
* [http://msdn.microsoft.com/en-us/library/windows/apps/hh465362 Guidelines for scaling] Windows Dev Center - User experience guidelines for scaling Metro style apps
 
* [[Windows Icon]] How to create icons that work with High DPI.
 
* [[Windows Icon]] How to create icons that work with High DPI.

Revision as of 15:23, 7 February 2019

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));

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