//gibt auf einem beliebigen TCanvas einen Farbverlauf horizontal oder vertikal aus
procedure Verlauf(PCanvas: TCanvas; VRect: TRect; sc, ec: TColor; direction,
wide: Byte);
var cv, vv, t: Integer;
ra, ga, ba, re, ge, be, r, g, b: Byte;
tr, tg, tb, cr, cg, cb: Extended;
begin
//Farb-Schritte t ermitteln
case direction of
1: t:=Abs(VRect.bottom-VRect.top); //horizontal
2: t:=Abs(VRect.right-VRect.left); //vertikal
end;
if t div wide<>t / wide then t:=t div wide + 1 else t:=t div wide;
ra:=GetRValue(sc); //Anfangsfarbe in
rot, grün, blau zerlegen
ga:=GetGValue(sc);
ba:=GetBValue(sc);
re:=GetRValue(ec); //Endfarbe in rot, grün,
blau zerlegen
ge:=GetGValue(ec);
be:=GetBValue(ec);
tr:=(re-ra)/t; //Diff. von Anfangs-
und Endfarbwerten durch Farb-Schritte ergibt Schrittweite tg:=(ge-ga)/t;
//(für jeweils rot, grün, blau)
tb:=(be-ba)/t;
r:=ra; cr:=ra;
g:=ga; cg:=ga;
b:=ba; cb:=ba;
vv:=0;
for cv:=0 to t-1 do
begin
PCanvas.Brush.Color:=RGB(r, g, b);
PCanvas.Pen.Color:=RGB(r, g, b);
case direction of
1: PCanvas.Rectangle(VRect.left, VRect.top+vv, VRect.right,
VRect.top+vv+wide);
2: PCanvas.Rectangle(VRect.left+vv, VRect.top, VRect.left+vv+wide,
VRect.bottom);
end;
cr:=cr+tr; r:=Round(cr);
cg:=cg+tg; g:=Round(cg);
cb:=cb+tb; b:=Round(cb);
vv:=vv+wide;
end;