利用API GradientFill画矩形渐变色,可以采用多种颜色。
代码如下:
#include <wingdi.h>
//把$(BCB)LibPsdkmsimg32.lib加入到工程中

/**//*
函数名: DrawGraden
功 能: 画矩形渐变色, 可以使用多种颜色
参 数: hdc - 上下文句柄
Rect - 整个画渐变的矩形范围
cl - 颜色数组
Num - 颜色数组中元素个数
dwMode - 模式, 可以使用GRADIENT_FILL_RECT_H 和 GRADIENT_FILL_RECT_V
返回值: 成功返回TRUE, 失败返回FALSE, GetLastError 错误信息获取;
*/
BOOL __fastcall DrawGraden(HDC hdc, CONST RECT *pRect, CONST DWORD *cl, int Num, DWORD dwMode)

...{
int Width;
int Height;
TRIVERTEX *pvert;
GRADIENT_RECT *pgRect;

if (cl == NULL || Num < 1 || pRect == NULL || dwMode == GRADIENT_FILL_TRIANGLE)

...{
::SetLastError(ERROR_INVALID_PARAMETER);
return TRUE;
}

if (Num == 1)

...{
HBRUSH hBrush = CreateSolidBrush(cl[0]);
SelectObject(hdc, hBrush);
FillRect(hdc, pRect, hBrush);
DeleteObject(hBrush);
return TRUE;
}

pvert = new TRIVERTEX[Num * 2 - 2];
pgRect = new GRADIENT_RECT[Num];

Width = pRect->right - pRect->left;
Height = pRect->bottom - pRect->top;
for (int i = 0; i < Num - 1; i++)

...{
if (dwMode == GRADIENT_FILL_RECT_V)

...{
pvert[i * 2].x = pRect->left;
pvert[i * 2].y = pRect->top + Height / (Num - 1) * i;

pvert[i * 2 + 1].x = pRect->right;
pvert[i * 2 + 1].y = pRect->top + Height / (Num - 1) * (i + 1);
}
else if (dwMode == GRADIENT_FILL_RECT_H)

...{
pvert[i * 2].x = pRect->left + Width / (Num - 1) * i;
pvert[i * 2].y = pRect->top;

pvert[i * 2 + 1].x = pRect->left + Width / (Num - 1) * (i + 1);
pvert[i * 2 + 1].y = pRect->bottom;
}

pvert[i * 2] .Red = (WORD)GetRValue((cl[i])) << 8;
pvert[i * 2] .Green = (WORD)GetGValue((cl[i])) << 8;
pvert[i * 2] .Blue = (WORD)GetBValue((cl[i])) << 8;
pvert[i * 2] .Alpha = 0x0000;

pvert[i * 2 + 1] .Red = (WORD)GetRValue((cl[i + 1])) << 8;
pvert[i * 2 + 1] .Green = (WORD)GetGValue((cl[i + 1])) << 8;
pvert[i * 2 + 1] .Blue = (WORD)GetBValue((cl[i + 1])) << 8;
pvert[i * 2 + 1] .Alpha = 0x0000;
pgRect[i].UpperLeft = i * 2;
pgRect[i].LowerRight = i * 2 + 1;
}

BOOL bRet = ::GradientFill(hdc, pvert, Num * 2, pgRect, Num - 1, dwMode);

delete []pvert;
delete []pgRect;

return bRet;
}

BCB应用代码和效果图:
void __fastcall TForm2::FormPaint(TObject *Sender)

...{

DWORD cl[5] = ...{clGreen, clYellow, clRed, clBlue, clFuchsia};
DrawGraden(this->Canvas->Handle, &(this->ClientRect), cl, 5, GRADIENT_FILL_RECT_H);
}