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