Впервые за тридцать лет программирования под винды озадачился ручным преобразованием диалоговых единиц размера (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.