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