2016-12-30 13 views
-2

Как нарисовать на холсте, внутри определенного Rect, a MULTILINE текст с некоторыми словами жирным шрифтом/цветным? на firemonkey ...Как нарисовать на холсте многострочный текст с некоторыми словами жирным/цветным?

Это не тот же вопрос, что и How to draw text with different font formatting to a canvas in delphi at once?, потому что я хочу нарисовать многострочный текст на firemonkey! текст, который ломается, чтобы вписаться в Rect. что-то вроде canvas.FillText, но с возможностью установить какое-то слово жирным шрифтом/

+0

Это должно быть очень прямолинейным, исходя из этого другого ответа. Единственное различие заключается в том, что когда вы достигли конца одной строки, увеличивайте Y на высоту текста. Каждый раз, когда вы рисуете, используйте 'Canvas.TextHeight' и сравнивайте его с максимальной высотой. Если он больше последнего, обновите его. Когда вы нарисуете следующую строку, вы узнаете, как далеко рисовать. –

+3

В следующий раз приложите усилия к своему вопросу, чтобы указать исследование, которое вы сделали перед публикацией, и написать более 10 слов в своем вопросе, и это может не закончиться как дубликат. Вы ** действительно ** должны начать улучшать свои вопросы здесь. (И для дальнейшего использования здесь ** неправильное ** поведение здесь, когда ваше сообщение закрывается, удаляет его и записывает его снова, ** правильное ** поведение - редактировать предыдущий вопрос, чтобы он снова открывался. Удаление и повторная передача в конечном счете, закроем вашу учетную запись, если вы не начнете получать некоторые важные ответы и ответы.) –

+0

Кроме того, второй ответ на этот другой вопрос будет отлично работать для многострочного текста. Кроме того, в этом первом ответе также упоминается, как WinAPI предоставляет еще одну альтернативу, также поддерживающую многострочные линии. Со всем этим, доступным в этом другом вопросе, я тоже проголосую, чтобы закрыть как дубликат –

ответ

1

ОК, так что, наконец, это был нелегкий способ достичь этого. обычно самый простой способ (и приемлемый ответ) - использовать 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 &lt; and &gt; 
           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}; 

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