
Как узнать установленный в системе масштаб текста

Как узнать установленный в системе масштаб текста
Технический прогресс неумолимо наступает, разрешение мониторов с каждым годом становится все больше. В результате пользователям приходится увеличивать масштаб, чтобы не ломать глаза разглядыванием микрошрифта. И если программа изначально написана под "стандартный" DPI=96, то при отображении на мониторе с бОльшим значением DPI некоторые элементы ее интерфейса скорее всего будут отображаться некорректно. Это приходится учитывать разработчикам при написании своих программ. По возможности я тоже начал обновлять свои утилиты, чтобы в них учитывался установленный в системе масштаб текста. Естественно, что для этого потребовались определенные инструменты.
Самый простой способ узнать установленный масштаб текста - прочитать его из реестра. Текущее значение записано в параметре AppliedDPI ключа HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics Дефолтному масштабу соответствует значение 96, для среднего оно будет 120 и для крупного - 144. В бесятке вроде бы есть масштаб 200%, для него значение DPI 192. Других значений не предусмотрено, по крайней мере я их пока не встречал.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------------
- ; Функция получения установленного значения DPI
- ;---------------------------------------------------------
- ; На выходе:
- ; EAX = установленное значение
- ;---------------------------------------------------------
- proc GetDPI
- locals
- phkResult dd ?
- lpdwDisp dd ?
- bufferSize dd ?
- result dd ?
- endl
- pusha
- ; На всякий случай дефолтное значение
- mov [result],96
- ; Прочитать значение из реестра
- KEY_WOW64_64KEY = 0x100
- lea eax,[phkResult]
- push eax
- invoke RegOpenKeyEx,HKEY_CURRENT_USER,.reg,NULL,\
- KEY_QUERY_VALUE+KEY_WOW64_64KEY
- jnz .loc_exit
- mov [bufferSize],4
- mov [lpdwDisp],REG_DWORD
- lea eax,[bufferSize]
- push eax
- lea eax,[result]
- push eax
- lea eax,[lpdwDisp]
- push eax
- invoke RegQueryValueEx,[phkResult],.key,0
- invoke RegCloseKey,[phkResult]
- .loc_exit:
- mov eax,[result]
- mov [esp+28],eax
- popa
- ret
- align 4
- .reg db 'Control Panel\Desktop\WindowMetrics',0
- align 4
- .key db 'AppliedDPI',0
- endp
Но просто получить значение DPI недостаточно, с его помощью надо будет пересчитывать различные параметры элементов диалогового окна. Для этого я нарисовал вот такую вспомогательную функцию.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------------
- ; Функция пересчета чисел на основании значения DPI
- ;---------------------------------------------------------
- ; На входе:
- ; dDPI - значение DPI, под которое нужно пересчитать
- ; dValue - пересчитываемое число
- ; На выходе:
- ; EAX = пересчитанное число
- ;---------------------------------------------------------
- proc ScaleDPI dDPI:DWORD,dValue:DWORD
- pusha
- mov eax,[dValue]
- mov ecx,[dDPI]
- ; Дефолтное DPI, ничего не конвертируем
- cmp ecx,96
- je .loc_ret
- ; NewValue = OldValue * DPI / 96
- xor edx,edx
- mul ecx
- mov ecx,96
- div ecx
- .loc_ret:
- mov [esp+28],eax
- popa
- ret
- endp
В приложении пример программы с исходником, которая определяет и выводит установленный в системе масштаб текста.
Просмотров: 664 | Комментариев: 3

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

ManHunter
(14.04.2023 в 14:15):
*непереводимая игра слов, с использованием местных идиоматических выражений*
Тут поправил, в программах тоже поправил, где успел добавить. Спасибо!
Тут поправил, в программах тоже поправил, где успел добавить. Спасибо!

Александр
(14.04.2023 в 14:04):
Ага, теперь понятно как вы определяете DPI в программе "Friendly Password Generator", у меня в "wine" версия 1.8 открывается с огромным масштабом символов в верхнем поле вообще пусто, а в нижнем помещаются 2,5 символа без прокрутки, оказалось в реестре "wine" нет ключа "AppliedDPI", после его добавления масштаб в программе корректный.

Добавить комментарий
Заполните форму для добавления комментария

100-125-150-175-200-225 %
Соответственно DPI для них
96-120-144-168-192-216
А в целом в десятке можно ставить от 100% до 500% любое DPI
К примеру, при 140% значение будет 134.