Преобразование размеров формы Delphi в диалоговые единицы (Dialog Units - DLU) является важной задачей при создании ресурсов для оконных приложений, особенно если требуется поддержка различных масштабов и разрешения экранов. Диалоговые единицы - это относительные единицы измерения, основанные на размере шрифта, используемого в диалоговом окне.
Вопрос пользователя заключается в том, что ему необходимо преобразовать размеры формы Delphi в диалоговые единицы для создания файла ресурсов .rc, который использует директиву DIALOGEX. Проблема заключается в том, что стандартная функция GetDialogBaseUnits из Windows API возвращает размеры шрифта системной шрифтовой темы, что не всегда соответствует шрифту, используемому в форме Delphi. Пользователь также пытался использовать формулу с учетом не системного шрифта, но столкнулся с трудностями в определении средних размеров символов системного шрифта.
Решение проблемы
Для преобразования пиксельных размеров формы в диалоговые единицы, можно использовать следующий подход:
Получите контекст устройства для экрана.
Выберите шрифт формы в контексте устройства.
Измерьте среднюю ширину и высоту символа для шрифта формы.
Рассчитайте диалоговые единицы, используя средние размеры символа шрифта формы и системного шрифта.
Вот пример кода на Object Pascal (Delphi), который демонстрирует, как это можно сделать:
procedure ConvertPixelsToDialogUnits(const FormHandle: HWND; const PixelsWidth, PixelsHeight: Integer; var DLUsWidth, DLUsHeight: Integer);
var
DC: HDC;
TM: TTextMetric;
Size: TSize;
AvgWidth, AvgHeight: Integer;
begin
DC := GetDC(0);
try
SelectObject(DC, FormHandle); // FormHandle - это дескриптор шрифта формы
if not GetTextMetrics(DC, TM) then
Exit;
AvgHeight := TM.tmHeight;
GetTextExtentPoint32(DC, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 52, Size);
AvgWidth := Round(Size.cx / 52);
// Здесь avgSysWidth и avgSysHeight можно получить с помощью GetDialogBaseUnits
// avgSysWidth := LoWord(GetDialogBaseUnits);
// avgSysHeight := HiWord(GetDialogBaseUnits);
// Для примера используем сделанные вручную значения
AvgSysWidth := 5;
AvgSysHeight := 8;
DLUsWidth := Round((4 * PixelsWidth) / (AvgWidth * 2 * AvgSysWidth));
DLUsHeight := Round((8 * PixelsHeight) / (AvgHeight * 2 * AvgSysHeight));
finally
ReleaseDC(0, DC);
end;
end;
Важно отметить, что в примере кода используются произвольные значения для AvgSysWidth и AvgSysHeight, которые в реальном приложении следует получить с помощью функции GetDialogBaseUnits.
После получения диалоговых единиц, их можно использовать для определения размеров диалогового окна в файле ресурсов:
Не забудьте, что размеры в диалоговых единицах относятся к клиентской области окна, без учета рамки.
Заключение
Преобразование размеров формы в диалоговые единицы требует понимания того, как шрифты и размеры элементов окна соотносятся друг с другом. Используя предложенный подход, можно успешно решить эту задачу и создать ресурсы для оконных приложений, которые будут корректно отображаться на различных устройствах.
Пользователь нуждается в преобразовании размеров формы Delphi в диалоговые единицы для создания ресурсов, учитывая, что стандартные функции Windows API не всегда возвращают нужные размеры шрифта, и требуется использовать шрифт конкрет
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS