Заставить DrawText разорвать строку - PullRequest
5 голосов
/ 02 мая 2011

Так что я могу сделать drawtext разорвать строку, если строка имеет пробелы, или если я вставил \ r \ n в конце строки. Однако длинная строка, в которой нет пробелов или разрывов строк, продолжается за прямоугольником рисования и обрезается. Я хотел бы предотвратить это, если это возможно.

Ничто в флагах формата для drawtext не выделялось мне, чтобы это могло произойти. Есть идеи?

Ответы [ 2 ]

9 голосов
/ 03 мая 2014

На самом деле, это то, что вы хотите в большинстве случаев, от MSDN :

DT_EDITCONTROL

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

Что не упоминается, так это то, что он также разбивает слова в середине, если это необходимо, как это делает элемент управления редактирования. Другой эффект заключается в том, что не отображаются частично видимые нижние линии, но в большинстве случаев я не думаю, что это будет иметь значение, поскольку вы, вероятно, используете DT_CALCRECT заранее, чтобы убедиться, что у вас достаточно места (и, если нет, не отрисовывает частично видимая линия, вероятно, лучше всего в любом случае). Если это действительно имеет значение, вы всегда можете сделать что-то с отсечением, например, дать DrawText более высокий прямоугольник, но уже иметь меньший прямоугольник клипа, установленный в контексте устройства.

5 голосов
/ 03 мая 2011

Что бы вы обычно обычно делали, это использовали флаг DT_WORDBREAK. Из документации DrawText на MSDN это:

ломает слова. Линии автоматически сломан между словами, если слово будет простираться за край прямоугольника определяется параметром lpRect. последовательность подачи обратной линии каретки также ломает черту.

Если это не указано, вывод включен одна строка.

Однако у вас есть одна неразрывная строка - то есть слов нет. Вам нужно будет самостоятельно следить за перерывами. Вы можете решить эту проблему двумя способами:

  • Используйте DrawText с DT_CALCRECT, чтобы вычислить размер цикла прямоугольника, сокращая строку, пока не найдете строку для первой строки, затем повторите для оставшейся строки. То есть найдите подмножество из индекса 0-n, которое горизонтально располагается по ширине области рисования; найдите строку из n + 1-m, которая снова умещается по горизонтали; повторяйте, пока не достигнете конца своей строки. Объедините эти подстроки с \r\n между каждой, чтобы вызвать разрыв вручную, затем нарисуйте с помощью DrawText, и он будет правильно обернут.

  • Используйте DrawTextEx и передайте указатель на структуру DRAWTEXTPARAMS. Он имеет член uiLengthDrawn, который представляет собой «количество символов, обработанных DrawTextEx, включая символы пробела. Число может быть длиной строки или индексом первой строки, которая падает ниже области рисования». Вы должны не передать DT_NOCLIP. Возможно, это (без тестирования) даст вам ту же информацию, что и в первом методе, без циклов: ключевой бит, который делает меня неуверенным, это фраза «под» областью рисования, и если ваша линия неразрывна, она может подумать обработан весь текст.

Первый метод всегда будет работать и представляет собой простую версию того, что я использую для собственной обработки расширенного текста.

...