Такая проблемка: контроли формируются динамически, в т.ч. высота и длина. Задача - расчитать максимально допустимый размер шрифта (шрифт не меняется). Частично я ее решил, ну... как то решил, по высоте расчитываю так
определяю сколько пикселей на пункт
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, без примера похоже не разберусь
Подбор размера шрифта для динамического контрола
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7385
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 14 раз
- Поблагодарили: 49 раз
Подбор размера шрифта для динамического контрола
Как я понимаю, эта задача имеет решение только для моноширинных шрифтов - тогда ширина рассчитывается, как и высота.
Иначе ширина контрола всё равно будет зависеть не только от кол-ва символов, но и от контекста.
Грубо говоря "ЖЖ" шире чем "iii" …
Похожую задачу решали в ветке LibXLSX - для определения кол-ва строк, которое занимает некий произвольный текст
в колонке с заданной шириной - посмотрите, там есть алгоритмы и идеи в этом направлении. Т.е. можно решать эту
задачу наоборот - определить ширину колонки, при которой заданный текст будет без переноса строк …
За теми кто отстал - не возвращаться. (С) Кодекс
Подбор размера шрифта для динамического контрола
Насколько я помню , в Кларионе использовалась следующая методика. Возможно, сейчас по-другому
1. Ширина буквы = 4 пункта ( исходя из размера заданного шрифта )
2. Высота буквы = 8 пунктов
3. Для определения средней ширины буквы на экран выводится строка '0123456789ABC.....Zabc.....z' ( в 5.5 попытались использовать ВСЕ символы, которые в текущей кодировке считались буквами, получилось нехорошо ). Строка незаметно выводится на экран, измеряется количество пикселов, делится на количество знаков ( здесь 62), частное = 4 пунктам.
4. Есть такие свойства как Prop:Nowidth и Prop:Noheight, позволяющие определять правильный размер строки.
Примерно так...
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
- Ветеран
- Сообщения: 909
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Подбор размера шрифта для динамического контрола
посмотреть, как это делается в AnyFont (CapeSoft). Там всё в исходниках, без dll.
WBR, morkovin
Подбор размера шрифта для динамического контрола
Вот это похоже то, что нужно !
Не знаю насколько рационально, но пока решл так:
Вначале определяю максим. допустимый размер шрифта из высоты. Далее в цикле проверяю на тестовом контроле с Prop:Nowidth=True не длиннее ли он контрола, если да, то шрифт уменьшается на 1.
Хотя и простой вариант расчета по горизонтали, исходя из условия Ширина символа=1/2 Высоты, так же как я рассчитывал по вертикали, тоже работает по моим тестам не хуже, но в обоих случаях надо брать не всю ширину контрола, а меньше, например 0.95