DrawText with DT CALCRECT-есть ли способ рассчитать высоту прямой кишки без изменения ширины (с большими строками)?


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

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

thisisaverylonglonglonglineoftextthatneedstofitinsideagivenrectwidth

Я вижу в MSDN docs , что DrawTextW() метод утверждает:

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

Однако в документах MSDN метод then DrawTextExW() этого не утверждает.

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

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

Редактировать:

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

1 6

1 ответ:

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

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

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