Непонятки с преобразованием DLU в точки и обратно
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.03.25 18:29
Оценка:
Впервые за тридцать лет программирования под винды озадачился ручным преобразованием диалоговых единиц размера (DLU) в точки растра и обратно, и сразу же нарвался на глюк.

Документация MS утверждает, что размеры элементов в описателях ресурсов задаются в DLU, которые равны 1/4 и 1/8 базовой единицы, соответственно, по горизонтали и вертикали. Масштаб экрана 100%, GetDialogBaseUnits возвращает 8 и 16, так что точек в DLU должно быть две по горизонтали и четыре по вертикали.

В описании кнопки в шаблоне диалога указан размер 60 x 14 DLUs. Следовательно, на экране она должна занимать 120 x 28 точек. Но фактически занимает 90 x 23 (это возвращает и GetWindowRect, то же самое получается при снятии копии экрана и измерении в редакторе).

Ладно, создаю структуру RECT, где right=left+60, и bottom=top+14. Передаю ее MapDialogRect, та возвращает TRUE. Вычитая left из right и top из bottom, получаю опять же 90 и 23.

В описании MapDialogRect брешут, что координаты вычисляются так:

left = MulDiv(left, baseunitX, 4);


По моим результатам видно, что это не так — по факту коэффициент равен не 2, а 1.5.

Где засада?

Проверял на масштабе 125% — GetDialogBaseUnits возвращает, как положено, 10 и 20, размер кнопки получается 105 x 28.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.