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

Преобразование высоты шрифта из LOGFONT в размер шрифта в пунктах

Delphi , Графика и Игры , Шрифты

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

Описание проблемы

У вас есть структура LOGFONT, и вам нужно получить размер шрифта в пунктах на основе поля lfHeight этой структуры.

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

Согласно документации MSDN, если режим отображения картинки (mapping mode) установлен в MM_TEXT (что обычно и происходит), и поле lfHeight в структуре LOGFONT положительное, то значение уже выражается в пунктах. Если же поле отрицательное, то единицы измерения — пиксели.

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

lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

Здесь 72 пункта соответствуют одному дюйму, а функция GetDeviceCaps(hDC, LOGPIXELSY) возвращает количество пикселей на дюйм для данного устройства. Чтобы получить размер шрифта в пунктах из пикселей, формулу следует инвертировать:

PointSize := MulDiv(-lfHeight, 72, GetDeviceCaps(hDC, LOGPIXELSY));

Важно понимать, что размер шрифта зависит от контекста устройства, на котором он отображается. Например, размер шрифта в пикселях на экране монитора будет отличаться от размера шрифта на принтере. Для получения корректного размера шрифта используйте свойство Handle канваса, на котором планируется рисование.

Дополнительные замечания

Необходимо отметить, что когда lfHeight положительный, шрифтовая карта предоставляет соответствие для высоты ячейки, которое включает в себя высоту символа и внутренний интерлиньяж. Чтобы получить размер шрифта в пунктах, нужно из высоты ячейки вычесть внутренний интерлиньяж и применить вышеуказанную формулу.

Также стоит учесть, что структура LOGFONT не содержит информации об внутреннем интерлиньяже, поэтому для расчета размера шрифта с положительным lfHeight необходимо выбрать шрифт в контекст устройства, затем использовать функцию GetTextMetrics и структуру TEXTMETRIC, после чего размер символа будет равен tmHeight - tmInternalLeading.

Альтернативные методы

  1. Используйте два младших бита поля lfPitchAndFamily для определения типа шрифта.
  2. Для шрифтов фиксированной ширины применяйте функцию GetTextMetrics и структуру TEXTMETRIC.
  3. Для переменно-ширинных шрифтов (например, TrueType) используйте GetOutlineTextMetrics и структуру OUTLINETEXTMETRIC. Обратите внимание, что структура может быть переменной длины, поэтому сначала необходимо узнать её размер, выделить память и только после этого заполнить её данными.

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


В данной статье мы рассмотрели, как преобразовать высоту шрифта из LOGFONT в размер шрифта в пунктах, учитывая различные контексты отображения и предоставленные инструменты Windows для работы со шрифтами.

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

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


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

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




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


:: Главная :: Шрифты ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-10 17:46:44/0.0037720203399658/0