FAQ:WinAPI VCPP:нарисовать прямоугольник с вертикальным цветовым градиентом

Материал из Весельчак У

Перейти к: навигация, поиск

Как нарисовать прямоугольник с вертикальным цветовым градиентом?

Нужно задать граничные значения цветов, затем равномерно нарисовать несколько прямоугольников постепенно меняющегося цвета. Количество прямоугольников, а, значит - плавность градиента, задаётся точностью.

Пример:

// вертикальный градиент
// pdc - указатель на контекст устройства
// pSize - указатель на структуру
// SIZE с размером прямоугольника
// dwdColor1, dwdColor2 - начальный и конечный цвет
// bySteps - количество шагов градиента (1...255)
void sFillVertGradientRect(CDC* pdc, SIZE *pSize, COLORREF dwdColor1,
COLORREF dwdColor2, BYTE bySteps)
{
WORD i=0;
long W=0;
long H=0;
long x1=0;
long x2=0;
 
BYTE R1=0;
BYTE G1=0;
BYTE B1=0;
BYTE R2=0;
BYTE G2=0;
BYTE B2=0;
 
float dh=0;
float dR=0;
float dG=0;
float dB=0;
float y1=0;
float y2=0;
float Rc=0;
float Gc=0;
float Bc=0;
 
if(!bySteps)
{
bySteps=1;
}
 
//ширина и высота
W=pSize->cx;
H=pSize->cy;
 
// раскладываем цвета на их составляющие
// для удобства дальнейших вычислений
R1=(BYTE)((dwdColor1 & 0x000000ff) );
G1=(BYTE)((dwdColor1 & 0x0000ff00) >> 8 );
B1=(BYTE)((dwdColor1 & 0x00ff0000) >> 16 );
R2=(BYTE)((dwdColor2 & 0x000000ff) );
G2=(BYTE)((dwdColor2 & 0x0000ff00) >> 8 );
B2=(BYTE)((dwdColor2 & 0x00ff0000) >> 16 );
 
// высота разноцветных прямоугольников
dh=(float)H / (float)bySteps;
 
// величина шагов составляющих цветов
dR=(float)(R2 - R1) / (float)bySteps;
dG=(float)(G2 - G1) / (float)bySteps;
dB=(float)(B2 - B1) / (float)bySteps;
 
// выводим прямоугольники
x1=0;
x2=W;
y1=0;
y2=dh;
Rc=R1;
Gc=G1;
Bc=B1;
 
for(i=0; i<bySteps; i++)
{
// текущий цвет
pdc->FillSolidRect(
x1,
(int)y1,
x2-x1,
(int)(y2-y1),
RGB((BYTE)Rc, (BYTE)Gc, (BYTE)Bc)
);
 
// следующий цвет и координаты
y1+=dh;
y2+=dh;
Rc+=dR;
Gc+=dG;
Bc+=dB;
}
}

Пример вызова:

SIZE Size={100, 100};
sFillGradientRect(&dc, &Size, RGB(200,0,0), RGB(0,200,0), 10);