![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Как в MessageBox реализован перенос текста? Мне нужен перенос не только по словам, но и по символам, для длинных строк.
Вторая строка не переносится. |
|||
|
||||
GremlinProg |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Если не хочется особенно разбираться, то в RichEdit есть возможность установить пользовательскую функцию переноса слов(EM_SETWORDBREAKPROC), а чтобы вывести этот текст в другой девайс, используй EM_FORMATRANGE.
Но такой способ требует наличия скрытого контрола в программе, это может быть не очень удобно. Я сделал свой вариант печати, тоже потребовался вывод с нормальным переносом, но в моем случае нужна был еще и подсветка синтаксиса. Я реализовал класс rtf_printer так:
код для юникода, кому нужно, локализуют как надо. пример:
здесь rc - прямоугольник в координатах hdc, в котором нужно вывести текст lpszText. Алгоритм пытается распределить текст по ширине прямоугольника, если солово длинное - переносит его на новую строку, если текст не помещается в прямоугольнике - добавляет в конец многоточие. prepare_dc и restore_dc - виртуальные методы для раскраски отдельных частей текста. prepare_dc должен вернуть длину разобранного слова, если оно меньше length. По умолчанию, она возвращает length. параметр calc_size позволяет расчитать точные ширину и высоту в прямоугольнике, т.е. не выводит текст, а только считает его. Результаты на выходе в параметрах max_width и max_height, т.е. можно перед выводом отцентрировать многострочный текст как надо. Если текст простой, сплошной, не rtf, то можно убрать первый цикл в основном методе print, он считает ширину и высоту всего текста, как если бы он был распечатан без переносов.
Вообще тут можно дополнительно к раскраске обрабатывать hittest на отдельных элементах скрипта, поэтому вывод отдельной последовательности print, сделан виртуальным.(в нем можно использовать x,y - координаты слова, а size - его ширина и высота) Один момент, который пришлось подгонять вручную: при расчете шрифта с подчеркиванием ни как не учитывается само подчеркивание, поэтому я тут просто добавляю единицу к высоте текста. Высота текста для любого форматирования - всегда доинакова на всех линиях, поэтому нежелательно использовать несколько разновысотных шрифтов, т.к. вывод не с базовой линии, а с левого-верхнего угла. PS: упростил класс rtf_printer, т.к. пословный перенос особенно и не интересен, а вот посимвольный вывод ускорился в разы. Это сообщение отредактировал(а) GremlinProg - 18.5.2008, 23:24 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |