Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Преобразование размеров формы Delphi в диалоговые единицы: решение проблемы с системным шрифтом

Delphi , Синтаксис , Справочник по API-функциям

Преобразование размеров формы Delphi в диалоговые единицы (Dialog Units - DLU) является важной задачей при создании ресурсов для оконных приложений, особенно если требуется поддержка различных масштабов и разрешения экранов. Диалоговые единицы - это относительные единицы измерения, основанные на размере шрифта, используемого в диалоговом окне.

Вопрос пользователя заключается в том, что ему необходимо преобразовать размеры формы Delphi в диалоговые единицы для создания файла ресурсов .rc, который использует директиву DIALOGEX. Проблема заключается в том, что стандартная функция GetDialogBaseUnits из Windows API возвращает размеры шрифта системной шрифтовой темы, что не всегда соответствует шрифту, используемому в форме Delphi. Пользователь также пытался использовать формулу с учетом не системного шрифта, но столкнулся с трудностями в определении средних размеров символов системного шрифта.

Решение проблемы

Для преобразования пиксельных размеров формы в диалоговые единицы, можно использовать следующий подход:

  1. Получите контекст устройства для экрана.
  2. Выберите шрифт формы в контексте устройства.
  3. Измерьте среднюю ширину и высоту символа для шрифта формы.
  4. Рассчитайте диалоговые единицы, используя средние размеры символа шрифта формы и системного шрифта.

Вот пример кода на 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.

После получения диалоговых единиц, их можно использовать для определения размеров диалогового окна в файле ресурсов:

DesignForm DIALOGEX 0, 0, DLUsWidth, DLUsHeight
STYLE ...
FONT ...
{
...
}

Не забудьте, что размеры в диалоговых единицах относятся к клиентской области окна, без учета рамки.

Заключение

Преобразование размеров формы в диалоговые единицы требует понимания того, как шрифты и размеры элементов окна соотносятся друг с другом. Используя предложенный подход, можно успешно решить эту задачу и создать ресурсы для оконных приложений, которые будут корректно отображаться на различных устройствах.

Создано по материалам из источника по ссылке.

Описание контекста: Пользователь нуждается в преобразовании размеров формы Delphi в диалоговые единицы для создания ресурсов, учитывая, что стандартные функции Windows API не всегда возвращают нужные размеры шрифта, и требуется использовать шрифт конкрет


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:04:32/0.0033969879150391/0