Dibujar un degradado es un tema bastante trillado del que podemos encontrar infinidad de ejemplos. Propongo un código sencillo para dibujar un degradado entre dos colores usando la API de Windows. Usar la API es un poquitín mas engorroso que la VCL pero nos permitirá usar el código en aquellos procesos en los que queramos ser independientes de librerías de clases, y por supuesto, este método es compatible con la VCL.
Como suelo hacer en muchas ocasiones, publicaré el código en C/C++ y delphi.
// Dibuja un rectángulo degradado desde Color1 a Color2 // Si Orientation = 1 el degradado es vertical, si Orientation =0, Horizontal void Degrade(HDC hDC, RECT Rect, int Color1, int Color2, int Orientation) { int R = GetRValue(Color1), G = GetGValue(Color1), B = GetBValue(Color1); int Rd = GetRValue(Color2)-R, Gd = GetGValue(Color2)-G, Bd = GetBValue(Color2)-B; int N; if(Orientation) N = Rect.bottom - Rect.top; else N = Rect.right - Rect.left; for(int i=0; i <= N; ++i){ int Color = RGB(R + MulDiv(Rd, i, N), G + MulDiv(Gd, i, N), B + MulDiv(Bd, i, N)); HPEN hPen = CreatePen(PS_SOLID, 0, Color); SelectObject(hDC, hPen); if(Orientation){ MoveToEx(hDC, Rect.left, Rect.top + i, 0); LineTo(hDC, Rect.right, Rect.top + i); }else{ MoveToEx(hDC, Rect.left + i, Rect.top, 0); LineTo(hDC, Rect.left + i, Rect.bottom); } DeleteObject(hPen); } }
Ejemplo de uso:
Degrade(Image1->Canvas->Handle, Image1->ClientRect, clLime, clGreen, 1);
Y en delphi:
// Dibuja un rectángulo degradado desde Color1 a Color2 // Si Orientation = 1 el degradado es vertical, si Orientation =0, Horizontal procedure Degrade(DC: HDC; Rect: TRect; Color1, Color2, Orientation: integer); var R, G, B, Rd, Gd, Bd, Color, i, N: integer; Pen: HPEN; begin R:= GetRValue(Color1); G:= GetGValue(Color1); B:= GetBValue(Color1); Rd:= GetRValue(Color2)-R; Gd:= GetGValue(Color2)-G; Bd:= GetBValue(Color2)-B; if Orientation <>0 then N:= Rect.bottom - Rect.top else N:= Rect.right - Rect.left; for i:=0 to N do begin Color:= RGB(R + MulDiv(Rd, i, N), G + MulDiv(Gd, i, N), B + MulDiv(Bd, i, N)); Pen:= CreatePen(PS_SOLID, 0, Color); SelectObject(DC, Pen); if Orientation <> 0 then begin MoveToEx(DC, Rect.left, Rect.top + i, 0); LineTo(DC, Rect.right, Rect.top + i); end else begin MoveToEx(DC, Rect.left + i, Rect.top, 0); LineTo(DC, Rect.left + i, Rect.bottom); end; DeleteObject(Pen); end; end;
Ejemplo:
Degrade(Image1.Canvas.Handle, Image1.ClientRect, clLime, clGreen, 0);
Saludos.