Страниц: [1]
  Печать  
Автор Тема: Автоперенос текста в PtRaw  (Прочитано 1994 раз)
GrayCat
Full Member
***
Offline Offline

Сообщений: 128


Gray©at


Просмотр профиля
« : Февраля 06, 2014, 12:11:35 pm »

Вот такой вопрос появился. QNX 6.3.2.

Например, PtMultiText умеет самостоятельно переносить текст, в том числе посимвольно (см. Pt_EMT_CHAR в ресурсе Pt_ARG_MULTITEXT_WRAP_FLAGS). Но, понятно что сам PtMultiText - штука очень "жирная", перерисовка нескольких десятков виджетов на мнемосхеме займёт заметное время.

Мнемосхема у нас рисуется как PtRaw. В принципе, в её функцию Draw() вполне можно впихнуть, в том числе, и написание нужного текста "голыми" командами типа PgDrawText() и т.п. Проблема в том, что текста довольно много, а места - мало, и нужно его переносить, впихивая максимально в отведённый прямоугольник.

Никаких функций написания текста "низкого уровня", умеющих самостоятельно переносить текст, или хотя бы сообщать программе, на сколько символов она его обрезала при выводе в заданный extent, я не увидел. Максимум что есть - это PgDrawMultiTextArea(), но она требует уже расставленных '\n' в тексте, сама определять количество поместившегося текста функция не может.

Отсюда и вопрос: как организовать вывод текста в Draw-функции с автоматическим переносом по буквам в пределах заданной ширины?

Я пока вижу такие варианты:

  • Использовать моноширинный шрифт. - Неинтересно, т.к. требуется упихивать максимальное количество текста в ограниченное пространство, а это может только пропорциональный.
  • В цикле от начала строки с помощью PgExtentText() посимвольно определять, когда предполагаемая ширина выводимого сегмента превысит заданную, вывести сегмент, продолжить то же самое от конца сегмента. Куча вызовов PgExtentText() (для каждого символа, фактически) совершенно не прибавит скорости.
  • Заранее для всех допустимых букв с помощью PgExtentText() составить табличку ширин, и при выводе по этой таблице быстро подсчитывать длину выводимх сегментов, аналогично предыдущему пункту. Осложняется UTF-символами.

Может, есть всё-таки какой-то штатный быстрый метод осуществить описанное?

Спасибо!
Записан

Gray©at
Страниц: [1]
  Печать  
 
Перейти в: