Вам следует использовать функцию MapDialogRect()
.
Передайте RECT
в единицах диалогового окна, и будет возвращен эквивалент RECT
в единицах пикселей. Обратите внимание, что вам нужен дескриптор диалога, чтобы дать MapDialogRect()
достаточный контекст. Функция должна знать шрифт, чтобы выполнить преобразование.
Если у вас возникнет соблазн использовать _5 _, помните, что сказал Рэймонд Чен: GetDialogBaseUnits - это посуда .
Как вы можете догадаться из названия этой записи, GetDialogBaseUnits - это черепаха. Поскольку для GetDialogBaseUnits нет параметра HWND, он не знает, какие DLU диалогового окна вы хотите получить. Так что догадки.
И он всегда ошибается.
GetDialogBaseUnits возвращает базовые единицы диалогового окна для диалоговых окон, в которых используется системный шрифт по умолчанию. Но системный шрифт по умолчанию больше никто не использует. Он кричит «старый и тупой». Но он остается по умолчанию из соображений совместимости. (И, следовательно, GetDialogBaseUnits тоже.)
Если вам нужно рассчитать размеры в пикселях из DLU и у вас нет дескриптора диалогового окна, вы должны использовать метод, описанный здесь: Как рассчитать базовые единицы диалогового окна с несистемным шрифтом
Однако в комментариях вы дали понять, что для решения вашей проблемы вам на самом деле не нужно преобразовывать DLU в пиксели. Вы можете использовать встроенное в Delphi масштабирование форм, чтобы гарантировать, что ваши формы имеют размер, соответствующий преобладающему масштабированию шрифтов.
person
David Heffernan
schedule
29.07.2011