вот только проблема с определением textwidth как его узнать =/
нужно для размещения текста посередине картинки
Навскидку :
1) msegraphics.pas : tcanvas.getstringwidth(string,font);
Помните - в MSE* GUI-элементы не имеют своих canvas, а используют единый общий ! Поэтому многие методы около-рисования реализованы в виде глобальных процедур, принимающих модификаторы (цвет, шрифт,...) - чтобы по ходу автоматически сохранять/восстанавливать общий canvas.
Чего пока нет (и нужно будет разве что в навороченных текстовых редакторах ) - держать ( и рисовать ) в одной richstring-строке текст разными шрифтами. Сейчас для этих целей нужно держать массив richstring-ов. Мартин говорит, что невозможно хранить в строке данные сразу о нескольких шрифтах (и стилях,размерах,..) - без жуткой потери производительности. Вопрос обсуждался, лобовое решение не найдено. Если кому-то эта тема интересна - милости просим. Тут главное - идея "как?".
===
Мартин о рисовании (вчера):
Я увидел рисовальный пример на "frepascal.ru". 
В MSEgui есть два метода рисования текста :
- простое позиционирование по базовой линии первого символа - с использованием tcanvas.drawstring ( с автопереводом строки на lineheight )
- использование  процедур "drawtext" модуля "msedrawstring.pas".
Попозже, будет возможно  задать подгонку текста в по размеру прям-ка рисования, используя флаги и табуляторы 
( от меня : думаю - как в репортере, "Latter" - обычно это несколько дней. )
Оптимизированное рисование из примера:
- Код: Выделить всё
- unit main;
 {$ifdef FPC}{$mode objfpc}{$h+}{$INTERFACES CORBA}{$endif}
 interface
 uses
 msegui,mseclasses,mseforms,msesimplewidgets,msegraphics,msegraphutils;
 
 type
 tmainfo = class(tmseform)
 tpaintbox1: tpaintbox;
 procedure paint(const sender: twidget; const canvas: tcanvas);
 procedure paint1(const sender: twidget; const canvas: tcanvas);
 procedure paint2(const sender: twidget; const canvas: tcanvas);
 end;
 var
 mainfo: tmainfo;
 implementation
 uses
 main_mfm,math;
 
 procedure tmainfo.paint(const sender: twidget; const canvas: tcanvas);
 var
 hstep: extended;
 yaxis: integer;
 i: integer;
 lastpoint, nextpoint: pointty;
 begin
 with canvas do begin
 hstep:= clipbox.cx/360;
 yaxis:= clipbox.y + clipbox.cy div 2;
 linewidthmm:= 1.0;
 
 lastpoint:= makepoint(0,yaxis);
 
 for i:= 0 to 360 do begin
 
 nextpoint:= makepoint(
 round(i*hstep),
 round(yaxis+sin(degtorad(i))*(clipbox.cy/2))
 );
 
 linewidthmm:= 0.5;
 drawline(
 makepoint(lastpoint.x,yaxis),
 makepoint(nextpoint.x,yaxis),
 cl_red
 );
 
 linewidthmm:= 1.0;
 drawline(lastpoint,nextpoint,cl_blue);
 lastpoint:= nextpoint;
 
 end;
 
 end;
 end;
 
 procedure tmainfo.paint1(const sender: twidget; const canvas: tcanvas);
 //curve drawn with disjointed lines
 var
 hstep,vscale: real;    //extended is i386 only
 int1: integer;
 lastpoint, nextpoint: pointty;
 begin
 with canvas do begin
 save; //save the current canvas state
 with sender.innerclientrect do begin  //canvas.cliprect is the bounding
 //rect of the current clip region,
 //it can e smaller than the widget rects.
 hstep:= cx/360;
 vscale:= -cy/2;                 //screen y direciont is inverted
 move(makepoint(x,y + cy div 2)); //set drawing origin into y center
 //default linwidth is 0 -> fastest one pixel width line drawing method.
 drawvect(nullpoint,gd_right,cx,cl_red); //base line
 end;
 lastpoint:= nullpoint;
 linewidth:= 3;       //use linewithmm only for printing (performance)
 for int1:= 0 to 360 do begin
 nextpoint.x:= round(int1*hstep);
 nextpoint.y:= round(sin(degtorad(int1))*vscale);
 drawline(lastpoint,nextpoint,cl_blue);
 lastpoint:= nextpoint;
 end;
 restore; //restore the canvas state
 end;
 end;
 
 procedure tmainfo.paint2(const sender: twidget; const canvas: tcanvas);
 //curve drawn with polyline (better)
 var
 hstep,vscale: real;    //extended is i386 only
 int1: integer;
 ar1: pointarty;
 begin
 with canvas do begin
 save; //save the current canvas state
 with sender.innerclientrect do begin
 hstep:= cx/360;
 vscale:= -cy/2;                  //screen y direciont is inverted
 move(makepoint(x,y + cy div 2)); //set drawing origin into y center
 //default linwidth is 0 -> fastest one pixel width line drawing method.
 drawvect(nullpoint,gd_right,cx,cl_red);   //base line
 end;
 setlength(ar1,360+1);
 for int1:= 0 to high(ar1) do begin
 ar1[int1].x:= round(int1*hstep);
 ar1[int1].y:= round(sin(degtorad(int1))*vscale);
 end;
 linewidth:= 3;       //use linewithmm only for printing (performance)
 drawlines(ar1,false,cl_blue);
 restore; //restore the canvas state
 end;
 end;
 
ПС:
Удобства "рисовальной" части до сих пор не были приоритетными - акцент делался на легкость написания бизнес-программ (БД,...). 
Просьба, кто владеет английским хоть чуть-чуть - смело пишите в NEWS-конференцию. Заодно и и английский натренируете !