Подбор размера шрифта для динамического контрола

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Андрей
Старожил
Сообщения: 254
Зарегистрирован: 30 Октябрь 2005, 3:58

Подбор размера шрифта для динамического контрола

Сообщение Андрей » 22 Июнь 2019, 16:01

Такая проблемка: контроли формируются динамически, в т.ч. высота и длина. Задача - расчитать максимально допустимый размер шрифта (шрифт не меняется). Частично я ее решил, ну... как то решил, по высоте расчитываю так

определяю сколько пикселей на пункт
g:PixInPunkt=g:HScr/(g:HScr_mm/25.4)/72 - g:HScr - высота экрана в пикс., g:HScr_mm - высота экрана в мм
потом подбираю, чтоб шрифт влезал по высоте
?STR_Zgl1{PROP:FontSize}=(?STR_Zgl1{PROP:Height}-2)/g:PixInPunkt

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

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4040
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Подбор размера шрифта для динамического контрола

Сообщение Игорь Столяров » 22 Июнь 2019, 21:05

Андрей писал(а):
22 Июнь 2019, 16:01
никто не решал подобную задачу ?
Как я понимаю, эта задача имеет решение только для моноширинных шрифтов - тогда ширина рассчитывается, как и высота.
Иначе ширина контрола всё равно будет зависеть не только от кол-ва символов, но и от контекста.
Грубо говоря "ЖЖ" шире чем "iii" … :)

Похожую задачу решали в ветке LibXLSX - для определения кол-ва строк, которое занимает некий произвольный текст
в колонке с заданной шириной - посмотрите, там есть алгоритмы и идеи в этом направлении. Т.е. можно решать эту
задачу наоборот - определить ширину колонки, при которой заданный текст будет без переноса строк … ;)
«V» значит Вендетта !

Yufil
Ветеран движения
Сообщения: 1110
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Подбор размера шрифта для динамического контрола

Сообщение Yufil » 22 Июнь 2019, 22:07

Насколько я помню , в Кларионе использовалась следующая методика. Возможно, сейчас по-другому
1. Ширина буквы = 4 пункта ( исходя из размера заданного шрифта )
2. Высота буквы = 8 пунктов
3. Для определения средней ширины буквы на экран выводится строка '0123456789ABC.....Zabc.....z' ( в 5.5 попытались использовать ВСЕ символы, которые в текущей кодировке считались буквами, получилось нехорошо ). Строка незаметно выводится на экран, измеряется количество пикселов, делится на количество знаков ( здесь 62), частное = 4 пунктам.
4. Есть такие свойства как Prop:Nowidth и Prop:Noheight, позволяющие определять правильный размер строки.

Код: Выделить всё

   Row# = Create( 0, Create:String ) 
   Row#{ Prop:NoHeight } = True 
   Row#{ Prop:NoWidth } = True 
   SetFont( Row#, ...... ) 
   Row#{ Prop:Text } = 'Мой текст' 
   ! Возможно, нам нужны пикселы 
   !  0{ Prop:Pixels } = True 
   RowWidh# = Row#{Prop:Width} 
   RowHeight = Row#{ Prop:Height } 
   !  Теперь мы знаем, сколько нам надо место под строку ... 
 
Примерно так...

Аватара пользователя
morkovin
Ветеран
Сообщения: 615
Зарегистрирован: 20 Июль 2005, 13:53
Откуда: Volgograd, Russia
Контактная информация:

Подбор размера шрифта для динамического контрола

Сообщение morkovin » 23 Июнь 2019, 5:08

Андрей писал(а):
22 Июнь 2019, 16:01
есть ли у кого примерчик кода получения длины строки через эту API, без примера похоже не разберусь
посмотреть, как это делается в AnyFont (CapeSoft). Там всё в исходниках, без dll.
WBR, morkovin

Андрей
Старожил
Сообщения: 254
Зарегистрирован: 30 Октябрь 2005, 3:58

Подбор размера шрифта для динамического контрола

Сообщение Андрей » 23 Июнь 2019, 9:35

Yufil писал(а):
22 Июнь 2019, 22:07
Есть такие свойства как Prop:Nowidth
Вот это похоже то, что нужно !
Не знаю насколько рационально, но пока решл так:
Вначале определяю максим. допустимый размер шрифта из высоты. Далее в цикле проверяю на тестовом контроле с Prop:Nowidth=True не длиннее ли он контрола, если да, то шрифт уменьшается на 1.

Хотя и простой вариант расчета по горизонтали, исходя из условия Ширина символа=1/2 Высоты, так же как я рассчитывал по вертикали, тоже работает по моим тестам не хуже, но в обоих случаях надо брать не всю ширину контрола, а меньше, например 0.95

Ответить