Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Dibujar un Gradient (Degradado) (https://www.clubdelphi.com/foros/showthread.php?t=42515)

Chris 16-04-2007 19:50:28

Dibujar un Gradient (Degradado)
 
Esta función la he extraído de una de las unidades del proyecto Jedi, es muy rápida y util al diseñar interfaces y modernas y muy profesionales.

Código Delphi [-]
 
{primero declaramos el Type en alguna parte de la unidad}   
Type   TGradientDirection = (gdVertical, gdHorizontal);   

{luego implementamos la función}  
function FillGradient(DC: HDC; ARect: TRect; ColorCount: Integer;
   StartColor, EndColor: TColor; ADirection: TGradientDirection): Boolean; 
var   StartRGB: array [0..2] of Byte;   
RGBKoef: array [0..2] of Double;   
Brush: HBRUSH;   
AreaWidth, AreaHeight, I: Integer;   
ColorRect: TRect;   
RectOffset: Double; 
begin   
RectOffset := 0;   
Result := False;   
if ColorCount < 1 then     
Exit;   
StartColor := ColorToRGB(StartColor);   
EndColor := ColorToRGB(EndColor);   
StartRGB[0] := GetRValue(StartColor);   
StartRGB[1] := GetGValue(StartColor);   
StartRGB[2] := GetBValue(StartColor);   
RGBKoef[0] := (GetRValue(EndColor) - StartRGB[0]) / ColorCount;   
RGBKoef[1] := (GetGValue(EndColor) - StartRGB[1]) / ColorCount;   
RGBKoef[2] := (GetBValue(EndColor) - StartRGB[2]) / ColorCount;   
AreaWidth := ARect.Right - ARect.Left;   
AreaHeight :=  ARect.Bottom - ARect.Top;   
case ADirection of     
gdHorizontal:       RectOffset := AreaWidth / ColorCount;     
gdVertical:       RectOffset := AreaHeight / ColorCount;   
end;   
for I := 0 to ColorCount - 1 do   
begin     
Brush := CreateSolidBrush(RGB(
       StartRGB[0] + Round((I + 1) * RGBKoef[0]),
       StartRGB[1] + Round((I + 1) * RGBKoef[1]),
       StartRGB[2] + Round((I + 1) * RGBKoef[2])));
     
case ADirection of       
gdHorizontal:
         SetRect(ColorRect, Round(RectOffset * I), 0, Round(RectOffset * (I + 1)), AreaHeight);
gdVertical:
         SetRect(ColorRect, 0, Round(RectOffset * I), AreaWidth, Round(RectOffset * (I + 1)));     
end;     OffsetRect(ColorRect, ARect.Left, ARect.Top);     

FillRect(DC, ColorRect, Brush);     
DeleteObject(Brush);   
end;   
Result := True; 
end;

Una forma elegante es dibujar un degradado reflejado, que está muy de moda actualmente, lo consigues creando dos <b>Rect</b> que son dos mitades del recuadro que realmente deseas pintar.

seoane 16-04-2007 20:01:25

:confused: ¿y cual es tu pregunta? O acaso estas recomendando los componentes Jedi ???

Chris 16-04-2007 20:09:23

Disculpa, pero reconozco que me equivoque, debí talvez escribir esto en la sección de trucos, pero bueno, ahora ya está y no la voy a borrar. y No estoy recomendando los componente Jedi, aunque debería.


La franja horaria es GMT +2. Ahora son las 04:24:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi