Как преобразовать DLU в пиксели?
Microsoft использует единицы длины диалога (DLU) в своих рекомендациях для пользовательского интерфейса. Как я могу преобразовать их в пиксели?
Как я знаю, DLU в зависимости от размера шрифта системы. Можете ли вы посоветовать какой-нибудь простой способ такого преобразования в Delphi для Win32?
3 ответов
вы должны использовать MapDialogRect()
.
как вы можете догадаться из названия этой записи, GetDialogBaseUnits это глиняный кувшин. Поскольку для GetDialogBaseUnits нет параметра HWND, он не знает, какой DLUs диалогового окна вы хотите получить. Так что гадает.
и он всегда угадывает неправильно.
GetDialogBaseUnits возвращает базовые единицы диалоговых окон, которые использовать системный шрифт по умолчанию. Но никто не использует системный шрифт уже. Он кричит "старый и тупой". Но он остается по умолчанию причины совместимости. (И поэтому тоже GetDialogBaseUnits.)
Если вам нужно рассчитать размеры пикселей из DLUs, и у вас нет дескриптора диалога, вы должны использовать метод, описанный здесь:Как рассчитать диалоговые базовые единицы с несистемным шрифтом
однако вы ясно дали понять в комментариях, что для вашей проблемы вам на самом деле не нужно конвертировать от DLUs до пикселей. Вы можете использовать встроенное масштабирование форм Delphi, чтобы обеспечить соответствующий размер форм для преобладающего масштабирования шрифтов.
сначала начнем с что диалоговое окно.
для этого я процитирую одного из мои собственные вопросы без ответов:
что такое диалоговое устройство?
диалоговое окно-это единица измерения, основанная на предпочтительном размере шрифта пользователя. Диалоговое окно определяется таким образом, что персонаж is 4 диалог блоки широко 8 блоками диалога высокими:
Это означает, что диалоговые блоки:
- изменить выбранный шрифт
- изменено с выбранной настройкой DPI
- не площадь
Я также процитирую еще один из мои собственные вопросы без ответов:
вы можете проверить Windows UX руководство чтобы увидеть, где эти замеры берутся. Краткая версия:
- dlu = диалог юнит
- dlu основан на размере шрифта (элементы меняются с размером шрифта пользователя)
- a горизонтальный dlu отличается от вертикальный dlu (dlu не квадратные)
это происходит из определения диалогового блока:средний характер 8dlus высокий 4dlus широким.
Грузия 14pt:
если вы используете меньший шрифт (т. е. 8pt Тахома стихи 14pt Грузия), то dlus меньше:
интерфейс шрифт Segoe шрифт 9pt:
Примечание: Вы заметите, что разрешение (т. е. dpi) не влияет на обсуждение.
Итак, что вам нужно-это средний размер персонажа. У Microsoft есть официальной техники для расчета среднего размер персонажа.
-
средний высота:
GetTextMetrics(dc, {var}textMetrics); averageHeight := textMetrics.tmHeight;
-
средняя ширина:
измерить строку ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz используя
GetTextExtentPoint32
, и разделить на 52:GetTextExtentPoint32(dc, PChar('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'), 52, Size)); averageWidth := size.cx / 52.0;
Итак, теперь вам нужен размер горизонтального и вертикального диалоговых блоков. Помните, что горизонтальная диалоговая единица равна 1/4 средней ширины символа, а вертикальная dlu составляет 1/8 средней высоты персонажа:
procedure GetDlus(dc: HDC; out HorizontalDluSize, VerticalDluSize: Real);
var
tm: TTextMetric;
size: TSize;
begin
GetTextMetric(dc, tm);
VerticalDluSize := tm.tmHeight / 8.0;
GetTextExtentPoint32(dc,
PChar('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'), 52,
size);
HorizontalDluSize := size.cx / 52.0;
end;
Примечание: любой код выпущен в общественное достояние. Атрибуция не требуется.
для базового значения (и, естественно, системного шрифта) вызовите GetDialogBaseUnits
. См. также remarks
абзац там для альтернативного метода перевода диалоговых единиц пикселей с GetTextMetrics
и/или GetTextExtentPoint32
без диалога HWND.