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);