Вписать текст в известную длину

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Вписать текст в известную длину

Сообщение NashRus » 11.06.2007 (Пн) 2:12

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

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 11.06.2007 (Пн) 4:19

например, с помощью DrawTextEx /DT_CALCRECT/ вычислить ширину с текущим фонтом, потом вычислить коэфф. (lprc.right -lprc.left)\mylenth.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.06.2007 (Пн) 9:26

Ширина текста нелинейно зависит от размера шрифта.
Там действуют кернинг, хинтинг и другие страшные слова.
Изображение

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 11.06.2007 (Пн) 10:27

Перебором, короче =)
Я делал попроще:
Код: Выделить всё
tw = Printer(Form).TextWidth("TEXT")


Потом действительно берешь коэффициент ( font.size = w / tw )

А далее - подгонка в цикле. Причем как раз их-за нелинейности проверять еще и на tw < w.. Чтобы не слишком мелко было.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 11.06.2007 (Пн) 12:25

tyomitch писал(а):Ширина текста нелинейно зависит от размера шрифта.
Там действуют кернинг, хинтинг и другие страшные слова.


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

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 12.06.2007 (Вт) 23:57

короче, сделал так:

Код: Выделить всё
    snFS1 = FontSize * (tpRect.Right - tpRect.Left) / TextWidth(sText)
    snFS2 = FontSize * (tpRect.Bottom - tpRect.Top) / TextHeight(sText)
    pGetFontSize = IIf(snFS1 < snFS2, snFS1, snFS2)


т.е. выбираю меньший размер в пропорциях по длине и по высоте. иногда ДрауТекст показывает в конце "...", но в основном Ок.

кто-то чего-то может еще сказать ?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2007 (Ср) 8:37

Могу сказать, что поверить алгеброй гармонию, найдя пропорциональность даже в моноширинных шрифтах, не удастся.
Возьми букву W, благодаря хинтингу она всегда симметричная (на пиксельном уровне, и значит, её ширина (в пикселах) всегда кратна четырём.
Значит, вписать её в строку, чья ширина не кратна четырём, не удастся ни при каком размере шрифта.
(Это просто иллюстративный пример.)
Изображение

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 13.06.2007 (Ср) 10:15

ну надо же не чтобы было "=", а чтобы "<=", заданной длины

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2007 (Ср) 15:21

Ну тогда ответ очевидный: шрифт размером 1пт впишется в любую длину :-D
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 71

    TopList