To semsy:
GDI 中提供了渐变色的 API,给你写了个函数,用起来没问题
type
//下面的一些定义其实 Windows.pas 单元已经提供,但是 delphi 中对 COLOR16 的定义有错误,致使一系列用到 COLOR16 的函数和记录都无法使用,只能重新定义
COLOR16 = Word;
TRIVERTEX = packed record
x: Longint;
y: Longint;
Red: COLOR16;
Green: COLOR16;
Blue: COLOR16;
Alpha: COLOR16;
end;
function GradientFill(DC: HDC; var Vertex: TRIVERTEX; NumVertex: ULONG; Mesh: Pointer; NumMesh, Mode: ULONG): BOOL;
stdcall; external msimg32 name 'GradientFill';
function R16(clr: COLORREF): COLOR16;
begin
Result := GetRValue(clr) shl 8;
end;
function G16(clr: COLORREF): COLOR16;
begin
Result := GetGValue(clr) shl 8;
end;
function B16(clr: COLORREF): COLOR16;
begin
Result := GetBValue(clr) shl 8;
end;
//x0, y0, x1, y1 是椭圆的左上角和右下角的坐标,clrLeft, clrRight 是左上角和右下角的颜色
procedure GradientEllipse(hdc: HDC; x0, y0, x1, y1: Integer; clrLeft, clrRight: TColor);
var
clr0, clr1: COLORREF;
vert: array[0..1] of TRIVERTEX;
index: GRADIENT_RECT;
hrgnClip: HRGN;
begin
clr0 := ColorToRGB(clrLeft);
clr1 := ColorToRGB(clrRight);
vert[0].x := x0;
vert[0].y := y0;
vert[0].Red := R16(clr0);
vert[0].Green := G16(clr0);
vert[0].Blue := B16(clr0);
vert[0].Alpha := 0;
vert[1].x := x1;
vert[1].y := y1;
vert[1].Red := R16(clr1);
vert[1].Green := G16(clr1);
vert[1].Blue := B16(clr1);
vert[1].Alpha := 0;
index.UpperLeft := 0;
index.LowerRight := 1;
hrgnClip := CreateEllipticRgn(x0, y0, x1, y1);
hrgnClip := SelectObject(hdc, hrgnClip);
GradientFill(hdc, vert[0], 2, @index, 1, GRADIENT_FILL_RECT_H);
DeleteObject(SelectObject(hdc, hrgnClip));
end;
GradientFill 也可以实现不同角度和方向的填充效果,如果要 45 度渐变,把矩形分割成两个三角形就可以了...