DrawText с DT_CALCRECT - Есть ли способ рассчитать высоту прямоугольника БЕЗ изменения ширины (с большими строками)? - PullRequest
6 голосов
/ 24 октября 2011

У меня есть строка, которая мне нужна для расчета размера Rect (высоты текста) при рисовании.Моя реализация использует функцию DrawTextW() с флагами DT_WORDBREAK or DT_CALCRECT.

Пример моей строки:

thisisaverylonglonglonglineoftextthatneedstofitinsideagivenrectwidth

Я вижу в MSDN документах , чтоDrawTextW() Состояния метода:

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

однако в документах MSDN метод DrawTextExW() не делаетзаявите это.

Итак, я попытался вычислить высоту, используя метод DrawTextExW(), однако результат такой же, как и с функцией DrawTextW(), где он расширяет ширину прямоугольника, чтобы соответствовать самой большой линииtext.

Так как я могу правильно рассчитать высоту текстового прямоугольника с заданной (фиксированной) шириной при рисовании большой строки (без пробелов), где указаны DT_WORDBREAK и DT_CALCRECT?

РЕДАКТИРОВАТЬ:

В качестве примечания, кто-нибудь знает, как Microsoft Excel делает рисование текста ячейки?Есть ли вызов API для этого текстового чертежа?Именно отсюда вытекает мой первоначальный вопрос, однако способ, которым он реализован в Excel, заключается в рисовании текста и переноса слов / переноса слов на любой символ (а не только на пробел).

1 Ответ

7 голосов
/ 24 октября 2011

Вам необходимо использовать флаг DT_WORD_ELLIPSIS в параметре uFormat (наряду с DT_WORDBREAK, конечно).Это предотвратит расширение из-за длинных строк без пробелов.Это все равно не сломает эти длинные строки, но ваша проблема с шириной будет решена.

Если вы также укажете DT_MODIFYSTRING, то вы можете выяснить, где сломать эту длинную строкуСтрока самостоятельно, до финального розыгрыша.

Что касается разницы между DrawText(W) и DrawTextEx(W): последний обеспечивает форматирование табуляции, устанавливает поля и возвращает фактическое количество нарисованных символов.Нет никакой разницы в функциональности (размерности).

...