ОК, так что, наконец, это был нелегкий способ достичь этого. обычно самый простой способ (и приемлемый ответ) - использовать TTextLayout. TTextlayout является довольно эффективным и поддерживает форматирование. проблема в том, что это не так, как некоторые другие думают, например, например, на цветных смайликах на андроиде
поэтому я в конечном итоге написал свою собственную функцию, которая перерыв текст. эта функция является слишком большой, чтобы быть постом здесь, но вы можете это видели https://svn.code.sf.net/p/alcinoe/code/ блока alFmxCommon
function ALDrawMultiLineText(const aText: String; // support only theses EXACT html tag :
// <b>...</b>
// <i>...</i>
// <font color="#xxxxxx">...</font>
// <span id="xxx">...</span>
// other < > must be encoded with < and >
var aRect: TRectF; // in => the constraint boundaries in real pixel. out => the calculated rect that contain the html in real pixel
var aTextBreaked: boolean; // true is the text was "breaked" in several lines
var aAscent: single; // out => the Ascent of the last element (in real pixel)
var aDescent: Single; // out => the Descent of the last element (in real pixel)
var aFirstPos: TpointF; // out => the point of the start of the text
var aLastPos: TpointF; // out => the point of the end of the text
var aElements: TalTextElements; // out => the list of rect describing all span elements
var aEllipsisRect: TRectF; // out => the rect of the Ellipsis (if present)
const aOptions: TALDrawMultiLineTextOptions): {$IFDEF _USE_TEXTURE}TTexture{$ELSE}Tbitmap{$ENDIF};
это совершенно не тривиальные разбить текст в нескольких линейных и также добавить форматирование этого текст, и это для всех цеха изготовления печатных форм
Это должно быть очень прямолинейным, исходя из этого другого ответа. Единственное различие заключается в том, что когда вы достигли конца одной строки, увеличивайте Y на высоту текста. Каждый раз, когда вы рисуете, используйте 'Canvas.TextHeight' и сравнивайте его с максимальной высотой. Если он больше последнего, обновите его. Когда вы нарисуете следующую строку, вы узнаете, как далеко рисовать. –
В следующий раз приложите усилия к своему вопросу, чтобы указать исследование, которое вы сделали перед публикацией, и написать более 10 слов в своем вопросе, и это может не закончиться как дубликат. Вы ** действительно ** должны начать улучшать свои вопросы здесь. (И для дальнейшего использования здесь ** неправильное ** поведение здесь, когда ваше сообщение закрывается, удаляет его и записывает его снова, ** правильное ** поведение - редактировать предыдущий вопрос, чтобы он снова открывался. Удаление и повторная передача в конечном счете, закроем вашу учетную запись, если вы не начнете получать некоторые важные ответы и ответы.) –
Кроме того, второй ответ на этот другой вопрос будет отлично работать для многострочного текста. Кроме того, в этом первом ответе также упоминается, как WinAPI предоставляет еще одну альтернативу, также поддерживающую многострочные линии. Со всем этим, доступным в этом другом вопросе, я тоже проголосую, чтобы закрыть как дубликат –