Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

FONT и параметры шрифта

15.02.2016, 03:56. Показов 2402. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для стандартной WINAPI работа с FONT (шрифтами) осуществляется через LOGFONT структуру.
Параметры вроде понятны, мсдн их описывает, кроме как... самих ньюансов работы с некоторыми LOGFONT членами.
И так перечисление шрифтов в системе: EnumFontFamiliesEx. (я юзаю только TRUETYPE_FONTTYPE типы)
Сама ссылка на МСДН эту тему.
Значит, высота, ПТ преобразовываются в логические единицы(в пикселях отн. устройства вывода) по формуле.
C++
1
lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
hDC (для монитора) - GetWindowDC(GetDesktopWindow())
И написано, что данная высота это есть высота "em height ?(1)", что это такое - не пишут, и мало того что не написано на МСДН, так и yandex и google на запрос о том что это - молчит, ну я посчитал линейкой, вроде как это полная высота (с верху - край Заглавной буквы, с низу край - маленькой буквы у или р например, где хвостик заезжает в низ. На самом же деле, например начинаеш смотреть в стандартных программах, например Excel - так, если меняеш шрифт, то и высота ячейки меняется, причём как - не понятно, ведь нет никаких членов описывающих это в LOGFONT. Ну вроде как это должно быть Line Hight ?(2) (что должно соответствовать высоте каретки, например в Edit Box, как она высчитывается - не понятно, смотриш на стандартные шрифты - везде по разному.

Следующий член структуры вообще какой то не понятный, это ширина lfWidth (3)... По стандарту ноль, а как эта ширина высчитывается не понятно.. Вроде написано что это тоже пиксели устройства, но как оно работает? Поидее должна быть какая то формула, которая должна отталкиваясь от высоты и отношения LOGPIXELSY и LOGPIXELSX как то разсчитать ширину (я так понимаю что под шириной подразумевается ширина символа '0', как это в других случаях с шрифтами). Я конешно путём тыка посмотрю через функцию GetCharABCWidths, и сравню что да как, но по тыку это делать - наткнусь на грабли, что потом в другом шрифте моя формула не сработает..

Как узнать и изменить пробелы между букв? (4) Я так понимаю что эти пробелы есть ABC, то есть A и C значения, но тоже очень странно, ведь если буква занимет положение не только B, но и залазиет в A и С, то где же хранится инфа о пробелах?(нашёл только какую то левую функцию, которая меняет на всём DC это значение, но это как то странно работает, потому в топку)

И может есть вариант в конце вообще выдрать из шрифта - саму картинку буквы (5), чтоб перенести её сразу в массив пикселей (в масштабе?) и там с ней работать так, чтоб можно было изменять всё что захочется?.. А то я смотрю на МСДН есть другие темы, но там уже юзается GDI+ и куда больше информации о шрифтах и функционал. (не очень хотелось бы его юзать, т.к. в итоге GDI вообще нафиг не сдался, он лишь стартовое представление должен давать, ну и работать для Box'ов всяких)

Добавлено через 37 минут
П.С. Юзаю я функцию CreateFontIndirect для создания шрифта.
Для того чтоб убрать ненужные EditBox (и других Box) отступы с лева-права, получаю Rect через Edit_GetRect и юзаю MoveWindow. (не уверен что правильно, однако работает. Тут кстати под вопрос, какую функцию для рисования юзают боксы? DrawText или что то другое?)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2016, 03:56
Ответы с готовыми решениями:

Font-Face размер шрифта
Здравствуйте! Подключаю шрифт через font-face. Задаю размер шрифта как в графическом редакторе, но на странице он выглядит в два раза...

Ошибка при загрузке шрифта Font Awesome
Здравствуйте, форумчане! Вот такие ошибки возникают, раньше ни разу такого не было, как исправить? Failed to decode downloaded...

SaveDIalog не сохраняет параметры шрифта
Всем доброго времени суток. Проблема следующего плана. Пишу программу аналог блокнота, при сохранении файл есть , данные заносятся но...

1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
19.02.2016, 10:47  [ТС]
Реальная высота шрифта - получается при использовании отрицательного значения. Реальная высота (включая Internal Leading) получается при положительном значении.
С высотой всё сделал через GetSystemMetrics. (1 и 2 пункты отпали)
Мелкософты конешно лолки, что не привели формулу, по которой вычисляется LOGFONT отношение высоты к Internal Leading.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.02.2016, 10:47
Помогаю со студенческими работами здесь

Как узнать параметры шрифта по умолчанию
Как программно узнать параметры шрифта по умолчанию для уже созданной книги? То есть не текущие параметры которые хранятся в...

Считать из текстового файла параметры шрифта и применить их для текста
в текстовом файле содержатся несколько строк в формате %№вопроса%название шрифта%размер шрифта%цвет%признак ответа% (Признак ответа 1 –...

Word 2007. Параметры шрифта выделенного текста разные. Как сделать одинаковыми?
Доброго дня, уважаемые! Вопрос в заголовке. Собственно после FineReader-а в одном и том же предложении, а то и слове встречается шрифт...

Резиновый font-size, Как сделать резионвый font-size в блоке?
<HTML> <HEAD>test</HEAD> <BODY> <style> .test { width: 20%; height: 9%; position: absolute; left: 0; top:...

<font color="red"> Текст </font>
Здравствуйте, не могу покрасить текст в красный цвет, в чем проблема? Код: &lt;?php session_start(); ?&gt; &lt;!DOCTYPE HTML...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru