Если найдете способ покрасивее чем пересоздавание картинки, буду признателен:
Код:
procedure TfrmSolar.Gradient(Image: TImage);
var
i: Integer;
Dr, Dg, Db, Colr: Extended;
begin
Dr := (R2 - R1) / Image.Height;
Dg := (G2 - G1) / Image.Height;
Db := (B2 - B1) / Image.Height;
for i := 0 to Image.Height - 1 do
begin
Image.Canvas.Pen.Color := rgb(Round(R1 + i * Dr), Round(G1 + i * Dg),
Round(B1 + i * Db));
Image.Canvas.MoveTo(0, i);
Image.Canvas.LineTo(Image.Width - 1, i);
end;
end;
где R1, R2, G1, G2, B1, B2 - константы начального и конечного цвета градиента.
LinkRepaint довольно сложная, но суть та же: юзаются только MoveTo, LineTo да Polygon.
Код:
procedure TfrmSolar.LinkRepaint;
const
d = 3;
l = 25;
var
i, j, t: Integer;
cx1, cy1, cx2, cy2: Integer;
k, dx1, dy1, dx2, dy2, g: Extended;
Points: array [0 .. 2] of TPoint;
begin
imgBack.Canvas.Brush.Color := rgb((R1 + R2) div 2, (G1 + G2) div 2,
(B1 + B2) div 2);
imgBack.Canvas.Pen.Color := $FFFFFF - imgBack.Canvas.Brush.Color;
imgBack.Canvas.Pen.Style := psDot;
imgBack.Canvas.MoveTo(0, imgBack.Height div 2);
imgBack.Canvas.LineTo(imgBack.Width - 1, imgBack.Height div 2);
imgBack.Canvas.Pen.Style := psSolid;
imgBack.Canvas.Pen.Color := $0;
for i := 0 to cimg - 1 do
for j := 0 to imgs[i].cl - 1 do
begin
cx1 := imgs[imgs[i].links[j]].Img.Left + imgs[imgs[i].links[j]]
.Img.Width div 2;
cy1 := imgs[imgs[i].links[j]].Img.Top + imgs[imgs[i].links[j]]
.Img.Height div 2;
cx2 := imgs[i].Img.Left + imgs[i].Img.Width div 2;
cy2 := imgs[i].Img.Top + imgs[i].Img.Height div 2;
if Max(cx1, cx2) = cx1 then
begin
t := cx2;
cx2 := cx1;
cx1 := t;
t := cy1;
cy1 := cy2;
cy2 := t;
end;
imgBack.Canvas.MoveTo(cx1, cy1);
imgBack.Canvas.LineTo(cx2, cy2);
dx1 := 0;
dy1 := 0;
dx2 := 0;
dy2 := 0;
if abs(cx2 - cx1) > 5 then
begin
k := (cy2 - cy1) / (cx2 - cx1);
g := arctan(d / l) + arctan(k);
dx1 := sqrt(l * l + d * d) * cos(g);
dy1 := sqrt(l * l + d * d) * sin(g);
g := arctan(k) - arctan(d / l);
dx2 := sqrt(l * l + d * d) * cos(g);
dy2 := sqrt(l * l + d * d) * sin(g);
end;
Points[0].X := cx2;
Points[0].Y := cy2;
Points[1].X := cx2 - Round(dx1);
Points[1].Y := cy2 - Round(dy1);
Points[2].X := cx2 - Round(dx2);
Points[2].Y := cy2 - Round(dy2);
imgBack.Canvas.Brush.Color := 0;
imgBack.Canvas.Polygon(Points);
end;
end;
Лучше не вникать, это лишь отрисовка стрелочек между объектами.