вот только проблема с определением 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-конференцию. Заодно и и английский натренируете !