PDA

Ver la Versión Completa : Dibujar un Gradient (Degradado)


Chris
16-04-2007, 19:50:28
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.


{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.