Fórum Gradiente de três cores em um TCanvas. #195541

17/11/2003

0

Preciso desenhar um gradiente de [b:3d2209e00f]três[/b:3d2209e00f] cores em um TCanvas, apenas em um determinado Rect. Como fazer?


Akelle Kara

Akelle Kara

Responder

Posts

18/11/2003

Akelle Kara

Sugestões?


Responder

Gostei + 0

19/11/2003

Marcelo Saviski

Fiz essa função meio no grito e ficou legalzinha :)

procedure DrawGradient(Canvas: TCanvas; ARect: TRect; Colors: array of TColor);
var
  I, NumColors, IColor, PixPerColor: Integer;
  R, G, B, IR, IG, IB: Single;
begin
  NumColors := Length(Colors);
  PixPerColor := (ARect.Right - ARect.Left) div (NumColors - 1);
  R := GetRValue(Colors[0]);
  G := GetGValue(Colors[0]);
  B := GetBValue(Colors[0]);
  IR := GetRValue(Colors[1]) - GetRValue(Colors[0]);
  IG := GetGValue(Colors[1]) - GetGValue(Colors[0]);
  IB := GetBValue(Colors[1]) - GetBValue(Colors[0]);
  IR := IR/PixPerColor;
  IG := IG/PixPerColor;
  IB := IB/PixPerColor;
  IColor := 1;
  for I := ARect.Left to ARect.Right do
   begin
    if ((I - ARect.Left) mod PixPerColor = 0) and (I <> ARect.Left) then
     begin
      R := GetRValue(Colors[IColor]);
      G := GetGValue(Colors[IColor]);
      B := GetBValue(Colors[IColor]);
      IR := GetRValue(Colors[IColor + 1]) - GetRValue(Colors[IColor]);
      IG := GetGValue(Colors[IColor + 1]) - GetGValue(Colors[IColor]);
      IB := GetBValue(Colors[IColor + 1]) - GetBValue(Colors[IColor]);
      IR := IR/PixPerColor;
      IG := IG/PixPerColor;
      IB := IB/PixPerColor;
      Inc(IColor);
     end;
    Canvas.Pen.Color := RGB(Trunc(R), Trunc(G), Trunc(B));
    Canvas.MoveTo(I, ARect.Top);
    Canvas.LineTo(I, ARect.Bottom);
    R := R + IR;
    G := G + IG;
    B := B + IB;
   end;
end;


Funciona com 2 ou + cores, não apenas 3

teste ela assim:

  DrawGradient(Canvas, Rect(0, 0, 500, 500), [clRed, clGreen, clWhite, clBlue, clBlack]);
  DrawGradient(Canvas, Rect(100, 100, 190, 280), [clRed, clGreen, clBlue]);


Funcionou?


Responder

Gostei + 0

19/11/2003

Akelle Kara

Funcionou muito bem, Valeu mesmo! :D


Responder

Gostei + 0

19/04/2012

Marco Antônio

Funcionou perfeitamente. No meu caso estou usando em um StringGrid no RowFixed(1)

DrawGradient(StrinGrid.Canvas, RECT , [ clRed , clWhite ]);

apenas adaptei "Rect(0, 0, 500, 500)" passando o proprio "Rect" por se tratar de toda a regiao da Célula.


Lembrando que usei qdo estou fazendo o DrawCell de uma linha fixada, e não de uma linha normal


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar