原创
// 绘制渐变色矩形
// c 原色
// kh, ks ,kl 色彩的 HSL 单位像素变化率
// 注:H 和 S 的渐变不能实现异色过渡
void GradientRectangle(RECT rct, COLORREF c, float kh, float ks, float kl)
{
float h, s, l;
RGBtoHSL(c, &h, &s, &l);
int nOldLineColor = getlinecolor();
for (int i = 0; i < rct.right - rct.left; i++)
{
setlinecolor(HSLtoRGB(h + i * kh, s + i * ks, l + i * kl));
line(i + rct.left, rct.top, i + rct.left, rct.bottom);
}
setlinecolor(nOldLineColor);
}
// 绘制渐变色矩形
// c1, c2 初始颜色、终止颜色
void GradientRectangle(RECT rct, COLORREF c1, COLORREF c2)
{
float h[2], s[2], l[2];
COLORREF c[2] = { c1,c2 };
for (int i = 0; i < 2; i++)
RGBtoHSL(c[i], &h[i], &s[i], &l[i]);
int len = rct.right - rct.left;
float kh = (h[1] - h[0]) / len;
float ks = (s[1] - s[0]) / len;
float kl = (l[1] - l[0]) / len;
GradientRectangle(rct, c[0], kh, ks, kl);
}
// 绘制渐变色矩形
// c 初始颜色(只用于 H 和 S 的采样)
// l1, l2 初始亮度、终止亮度(暗 0 ~ 1 亮)
void GradientRectangle(RECT rct, COLORREF c, double l1, double l2)
{
float h, s, l;
RGBtoHSL(c, &h, &s, &l);
GradientRectangle(rct, HSLtoRGB(h, s, (float)l1), 0, 0, (float)(l2 - l1) / (rct.right - rct.left));
}
只写了横向的颜色过渡。