利用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)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);
}