Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вывод текста средствами WINAPI  (Прочитано 12647 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« : 21-04-2017 09:13 » 

Добрый день.

Задался целью попробовать разобраться и сделать вывод текста без подгонки и притирки разными коэффициентами.

Суть задачи: ЕСКД требует, чтобы высота текста измерялась высотой литеры "Х", и задаёт стандартные величины высот в мм: 2,5, 3,5, 5, 7... Однако, как я понял в системе компьютерного отображения за высоту принят некий виртуальный параметр - высота глифа. А глиф может быть и не заполнен литерой от и до, в итоге имеются расхождения.

Было бы идеально, чтобы любой выбранный шрифт автоматически подбирал соответствующие коэффициенты поправки. На настоящий момент, коэффициенты подобраны вручную для шрифтов ГОСТа и некоторых часто используемых.

Изначально, пробовал использовать DrawText(), но нюансы выяснились сразу, например, странное поведение DT_VCENTER, который не центрирует симметрично.
DT_CALCRECT выдаёт без флага DT_VCENTER зону заметно большую шрифта, а с этим флагом уменьшает зону так, что часть текста по вертикали пропадает.

Затем поэкспериментировал с GetTextExtentPoint32() результат тот же - зона больше габарита, и соответственно, высота не та, которая нужна.

Последняя надежда была на GetTextMetrics() - результат тот же.

Не знаю, что можно попробовать ещё? Хотелось бы извлечь из выбранного шрифта высоту литеры "Х", а потом уже масштабировать вывод от неё. Несимметричность центрирования тоже напрягает.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 22-04-2017 06:23 » 

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

https://msdn.microsoft.com/en-us/library/windows/desktop/ff684173(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/dd144877(v=vs.85).aspx
Записан

Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 22-04-2017 15:28 » 

Спасибо.

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

Мне интересно: существуют ли отдельные библиотеки для двумерной растеризации текста? Посмотрел в сторону "Cairo", но, как понял, она опирается на функции предоставляемые системой. Значит результат вклада усилий в её изучение может того и не стоить.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 23-04-2017 20:32 » new

Если позволяет архитектура, то, прибегнув к помощи gdi+, можно перегнать текст в путь и получить из него охватывающий прямоугольник.
Он проходит точно по границам глифа.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 24-04-2017 13:56 » 

Если позволяет архитектура, то, прибегнув к помощи gdi+, можно перегнать текст в путь и получить из него охватывающий прямоугольник.
Он проходит точно по границам глифа.
Я так понял, что "GDI+" - это обёртка для адаптации WINAPI к С++, поэтому и спустился к базовому функционалу. Возможно, моё представление не совсем корректно?

Сейчас использую MinGW 5.3.0 он поддерживает "GDI+", можно и попробовать.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines