这里有些不同的渐变效果,你看看,
unit rbgradutils;
interface
uses Windows, Classes, Graphics, forms, Controls, Dialogs;
type
TGradientFillType = (rgsHorizontal, rgsVertical, rgsElliptic, rgsRectangle,
rgsVerticalCenter,
rgsHorizontalCenter, rgsNWSE, rgsNWSW, rgsSENW, rgsSWNE, rgsSweet,
rgsStrange, rgsNeo);
procedure RbsGradientFill(Canvas: TCanvas; grdType: TGradientFillType; fromCol:
TColor;
toCol: TColor; ARect: TRect);
implementation
procedure RbsGradientFill(Canvas: TCanvas; grdType: TGradientFillType; fromCol:
TColor;
toCol: TColor; ARect: TRect);
var
FromR, FromG, FromB: Integer;
DiffR, DiffG, DiffB: Integer;
i: integer;
bm: TBitmap;
ColorRect: TRect;
R, G, B: Byte;
//for elliptical
Pw, Ph: Real;
x0, y0, x1, y1, x2, y2, x3, y3: Real;
points: array[0..3] of TPoint;
haf: Integer;
begin
//set bitmap
bm := TBitmap.Create;
bm.Width := ARect.Right;
bm.Height := ARect.Bottom;
//calc colors
FromR := fromcol and $000000FF; //Strip out separate RGB values
FromG := (fromcol shr 8) and $000000FF;
FromB := (fromcol shr 16) and $000000FF;
DiffR := (tocol and $000000FF) - FromR; //Find the difference
DiffG := ((tocol shr 8) and $000000FF) - FromG;
DiffB := ((tocol shr 16) and $000000FF) - FromB;
//draw gradient
case grdType of
rgsHorizontal:
begin
ColorRect.Top := 0; //Set rectangle top
ColorRect.Bottom := bm.Height;
for I := 0 to 255 do
begin //Make lines (rectangles) of color
ColorRect.Left := MulDiv(I, bm.Width, 256);
//Find left for this color
ColorRect.Right := MulDiv(I + 1, bm.Width, 256); //Find Right
R := fromR + MulDiv(I, diffr, 255); //Find the RGB values
G := fromG + MulDiv(I, diffg, 255);
B := fromB + MulDiv(I, diffb, 255);
bm.Canvas.Brush.Color := RGB(R, G, B); //Plug colors into brush
bm.Canvas.FillRect(ColorRect); //Draw on Bitmap
end;
end;
rgsVertical:
begin
ColorRect.Left := 0; //Set rectangle left&right
ColorRect.Right := bm.Width;
for I := 0 to 255 do
begin //Make lines (rectangles) of color
ColorRect.Top := MulDiv(I, bm.Height, 256);
//Find top for this color
ColorRect.Bottom := MulDiv(I + 1, bm.Height, 256); //Find Bottom
R := fromr + MulDiv(I, diffr, 255); //Find the RGB values
G := fromg + MulDiv(I, diffg, 255);
B := fromb + MulDiv(I, diffb, 255);
bm.Canvas.Brush.Color := RGB(R, G, B); //Plug colors into brush
bm.Canvas.FillRect(ColorRect); //Draw on Bitmap
end;
end;
rgsElliptic:
begin
bm.Canvas.Pen.Style := psClear;
bm.Canvas.Pen.Mode := pmCopy;
x1 := 0 - (bm.Width / 4);
x2 := bm.Width + (bm.Width / 4) + 4;
y1 := 0 - (bm.Height / 4);
y2 := bm.Height + (bm.Height / 4) + 4;
Pw := ((bm.Width / 4) + (bm.Width / 2)) / 155;
Ph := ((bm.Height / 4) + (bm.Height / 2)) / 155;
for I := 0 to 155 do
begin //Make ellipses of color
x1 := x1 + Pw;
x2 := X2 - Pw;
y1 := y1 + Ph;
y2 := y2 - Ph;
R := fromr + MulDiv(I, diffr, 155); //Find the RGB values
G := fromg + MulDiv(I, diffg, 155);
B := fromb + MulDiv(I, diffb, 155);
bm.Canvas.Brush.Color := R or (G shl 8) or (b shl 16);
//Plug colors into brush
bm.Canvas.Ellipse(Trunc(x1), Trunc(y1), Trunc(x2), Trunc(y2));
end;
end;
rgsRectangle:
begin
bm.Canvas.Pen.Style := psClear;
bm.Canvas.Pen.Mode := pmCopy;
x1 := 0;
x2 := bm.Width + 2;
y1 := 0;
y2 := bm.Height + 2;
Pw := (bm.Width / 2) / 255;
Ph := (bm.Height / 2) / 255;
for I := 0 to 255 do
begin //Make rectangles of color
x1 := x1 + Pw;
x2 := X2 - Pw;
y1 := y1 + Ph;
y2 := y2 - Ph;
R := fromr + MulDiv(I, diffr, 255); //Find the RGB values
G := fromg + MulDiv(I, diffg, 255);
B := fromb + MulDiv(I, diffb, 255);
bm.Canvas.Brush.Color := RGB(R, G, B); //Plug colors into brush
bm.Canvas.FillRect(Rect(Trunc(x1), Trunc(y1), Trunc(x2),
Trunc(y2)));
end;
end;
rgsVerticalCenter:
begin
Haf := bm.Height div 2;
ColorRect.Left := 0;
ColorRect.Right := bm.Width;
for I := 0 to Haf do
begin
ColorRect.Top := MulDiv(I, Haf, Haf);
ColorRect.Bottom := MulDiv(I + 1, Haf, Haf);
R := fromr + MulDiv(I, diffr, Haf);
G := fromg + MulDiv(I, diffg, Haf);
B := fromb + MulDiv(I, diffb, Haf);
bm.Canvas.Brush.Color := RGB(R, G, B);
bm.Canvas.FillRect(ColorRect);
ColorRect.Top := bm.Height - (MulDiv(I, Haf, Haf));
ColorRect.Bottom := bm.Height - (MulDiv(I + 1, Haf, Haf));
bm.Canvas.FillRect(ColorRect);
end;
end;
rgsHorizontalCenter:
begin
Haf := bm.Width div 2;
ColorRect.Top := 0;
ColorRect.Bottom := bm.Height;
for I := 0 to Haf do
begin
ColorRect.Left := MulDiv(I, Haf, Haf);
ColorRect.Right := MulDiv(I + 1, Haf, Haf);
R := fromr + MulDiv(I, diffr, Haf);
G := fromg + MulDiv(I, diffg, Haf);
B := fromb + MulDiv(I, diffb, Haf);
bm.Canvas.Brush.Color := RGB(R, G, B);
bm.Canvas.FillRect(ColorRect);
ColorRect.Left := bm.Width - (MulDiv(I, Haf, Haf));
ColorRect.Right := bm.Width - (MulDiv(I + 1, Haf, Haf));
bm.Canvas.FillRect(ColorRect);
end;
end;
rgsNWSE:
begin
bm.canvas.Pen.Style := psclear;
bm.canvas.Pen.Mode := pmCopy;
Pw := (bm.Width + bm.height) / 255;
for I := 0 to 254 do
begin //Make trapeziums of color
x0 := i * Pw;
if (x0 < bm.width) then
y0 := 0
else
begin
y0 := x0 - bm.width;
x0 := bm.width - 1;
end;
x1 := (i + 1) * pw;
if (x1 < bm.width) then
begin
y1 := 0;
end
else
begin
y1 := x1 - bm.width;
x1 := bm.width - 1;
end;
y2 := i * pw;
if (y2 < bm.height) then
x2 := 0
else
begin
x2 := y2 - bm.height;
y2 := bm.height - 1;
end;
y3 := (i + 1) * pw;
if (y3 < bm.height) then
x3 := 0
else
begin
x3 := y3 - bm.height;
y3 := bm.height - 1;
end;
R := fromr + MulDiv(I, diffr, 255); //Find the RGB values
G := fromg + MulDiv(I, diffg, 255);
B := fromb + MulDiv(I, diffb, 255);
bm.canvas.Brush.Color := RGB(R, G, B); //Plug colors into brush
points[0] := point(Trunc(x0), Trunc(y0));
points[1] := point(Trunc(x1), Trunc(y1));
points[3] := point(Trunc(x2), Trunc(y2));
points[2] := point(Trunc(x3), Trunc(y3));
bm.canvas.polygon(points);
end;
end;
rgsNWSW:
begin
bm.canvas.Pen.Style := psclear;
bm.canvas.Pen.Mode := pmCopy;
Pw := (bm.width + bm.height) / 255;
for I := 0 to 254 do
begin //Make trapeziums of color
y0 := i * Pw;
if (y0 < bm.height) then
x0 := bm.width - 1
else
begin
x0 := bm.width - 1 - (y0 - bm.height);
y0 := bm.height - 1;
end;
y1 := (i + 1) * pw;
if (y1 < bm.height) then
x1 := bm.width - 1
else
begin
x1 := bm.width - 1;
end;
x2 := bm.width - 1 - (i * pw);
if (x2 > 0) then
y2 := 0
else
begin
y2 := -x2;
x2 := 0;
end;
x3 := bm.width - 1 - ((i + 1) * pw);
if (x3 > 0) then
y3 := 0
else
begin
y3 := -x3;
x3 := 0;
end;
R := fromr + MulDiv(I, diffr, 255); //Find the RGB values
G := fromg + MulDiv(I, diffg, 255);
B := fromb + MulDiv(I, diffb, 255);
bm.canvas.Brush.Color := RGB(R, G, B); //Plug colors into brush
points[0] := point(Trunc(x0), Trunc(y0));
points[1] := point(Trunc(x1), Trunc(y1));
points[3] := point(Trunc(x2), Trunc(y2));
points[2] := point(Trunc(x3), Trunc(y3));
bm.canvas.polygon(points);
end;
end;
rgsSENW:
begin
bm.canvas.Pen.Style := psclear;
bm.canvas.Pen.Mode := pmCopy;
Pw := (bm.width + bm.height) / 255;
for I := 0 to 254 do
begin //Make trapeziums of color
y0 := bm.height - 1 - (i * Pw);
if (y0 > 0) then
x0 := bm.width - 1
else
begin
x0 := bm.width - 1 + y0;
y0 := 0;
end;
y1 := bm.height - 1 - ((i + 1) * pw);
if (y1 > 0) then
x1 := bm.width - 1
else
begin
x1 := bm.width - 1 + y1;
y1 := 0;
end;
x2 := bm.width - 1 - (i * pw);
if (x2 > 0) then
y2 := bm.height - 1
else
begin
y2 := bm.height - 1 + x2;
x2 := 0;
end;
x3 := bm.width - 1 - ((i + 1) * pw);
if (x3 > 0) then
y3 := bm.height - 1
else
begin
y3 := bm.height - 1 + x3;
x3 := 0;
end;
R := fromr + MulDiv(I, diffr, 255); //Find the RGB values
G := fromg + MulDiv(I, diffg, 255);
B := fromb + MulDiv(I, diffb, 255);
bm.canvas.Brush.Color := RGB(R, G, B); //Plug colors into brush
points[0] := point(Trunc(x0), Trunc(y0));
points[1] := point(Trunc(x1), Trunc(y1));
points[3] := point(Trunc(x2), Trunc(y2));
points[2] := point(Trunc(x3), Trunc(y3));
bm.canvas.polygon(points);
end;
end;
rgsSWNE:
begin
bm.canvas.Pen.Style := psclear;
bm.canvas.Pen.Mode := pmCopy;
Pw := (bm.width + bm.height) / 255;
for I := 0 to 254 do
begin //Make trapeziums of color
y0 := bm.height - 1 - (i * Pw);
if (y0 > 0) then
x0 := 0
else
begin
x0 := -y0;
y0 := 0;
end;
y1 := bm.height - 1 - ((i + 1) * pw);
if (y1 > 0) then
x1 := 0
else
begin
x1 := -y1;
y1 := 0;
end;
x2 := (i * pw);
if (x2 < bm.width) then
y2 := bm.height - 1
else
begin
y2 := bm.height - 1 - (x2 - bm.width);
x2 := bm.width - 1;
end;
x3 := (i + 1) * pw;
if (x3 < bm.width) then
y3 := bm.height - 1
else
begin
y3 := bm.height - 1 - (x3 - bm.width);
x3 := bm.width - 1;
end;
R := fromr + MulDiv(I, diffr, 255); //Find the RGB values
G := fromg + MulDiv(I, diffg, 255);
B := fromb + MulDiv(I, diffb, 255);
bm.canvas.Brush.Color := RGB(R, G, B); //Plug colors into brush
points[0] := point(Trunc(x0), Trunc(y0));
points[1] := point(Trunc(x1), Trunc(y1));
points[3] := point(Trunc(x2), Trunc(y2));
points[2] := point(Trunc(x3), Trunc(y3));
bm.canvas.polygon(points);
end;
end;
rgssweet:
begin
bm.canvas.Pen.Style := psclear;
bm.canvas.Pen.Mode := pmCopy;
for i := 0 to 255 do
begin
x1 := muldiv(i, bm.Width, 255);
x2 := muldiv(i + 1, bm.Width, 255);
y1 := muldiv(i, bm.Height, 255);
y2 := muldiv(i + 1, bm.Height, 255);
R := fromr + MulDiv(I, diffr, 255); //Find the RGB values
G := fromg + MulDiv(I, diffg, 255);
B := fromb + MulDiv(I, diffb, 255);
bm.Canvas.Brush.Color := RGB(R, G, B);
points[0] := point(bm.Width div 2, bm.Height div 2);
points[1] := point(0, trunc(y1));
points[2] := point(0, trunc(y2));
points[3] := points[2];
bm.canvas.polygon(points);
points[0] := point(bm.Width div 2, bm.Height div 2);
points[1] := point(bm.Width, bm.Height - trunc(y1));
points[2] := point(bm.Width, bm.Height - trunc(y2));
points[3] := points[2];
bm.canvas.polygon(points);
points[0] := point(bm.Width div 2, bm.Height div 2);
points[1] := point(trunc(x1), 0);
points[2] := point(trunc(x2), 0);
points[3] := points[2];
bm.canvas.polygon(points);
points[0] := point(bm.Width div 2, bm.Height div 2);
points[1] := point(bm.Width - trunc(x1), bm.Height);
points[2] := point(bm.Width - trunc(x2), bm.Height);
points[3] := points[2];
bm.canvas.polygon(points);
end;
end;
rgsStrange:
begin
bm.canvas.Pen.Style := psclear;
bm.canvas.Pen.Mode := pmCopy;
for i := 0 to 255 do
begin
x1 := muldiv(i, bm.Width, 255);
y1 := muldiv(i, bm.Height, 255);
R := fromr + MulDiv(I, diffr, 255); //Find the RGB values
G := fromg + MulDiv(I, diffg, 255);
B := fromb + MulDiv(I, diffb, 255);
bm.Canvas.Brush.Color := RGB(R, G, B);
points[0] := point(trunc(x1), trunc(y1));
points[1] := point(0, bm.Height - trunc(y1));
points[2] := point(bm.Width, bm.Height);
points[3] := point(bm.width, 0);
bm.canvas.polygon(points);
end;
end;
rgsNeo:
begin
bm.canvas.Pen.Style := psclear;
bm.canvas.Pen.Mode := pmCopy;
for i := 0 to 255 do
begin
x1 := muldiv(i, bm.Width div 2, 255);
y1 := muldiv(i, bm.Height div 2, 255);
R := fromr + MulDiv(I, diffr, 255); //Find the RGB values
G := fromg + MulDiv(I, diffg, 255);
B := fromb + MulDiv(I, diffb, 255);
bm.Canvas.Brush.Color := RGB(R, G, B);
points[0] := point(trunc(x1), trunc(y1));
points[1] := point(0, bm.Height);
points[2] := point(bm.Width - trunc(x1), bm.Height - trunc(y1));
points[3] := point(bm.width, 0);
bm.canvas.polygon(points);
end;
end;
end;
BitBlt(Canvas.Handle, 0, 0, bm.Width, bm.Height, bm.Canvas.Handle, 0, 0,
SRCCOPY);
//Canvas.CopyRect(arect,bm.Canvas,arect);
bm.Free;
end;
end.