Gradiente de três cores em um TCanvas.
Preciso desenhar um gradiente de [b:3d2209e00f]três[/b:3d2209e00f] cores em um TCanvas, apenas em um determinado Rect. Como fazer?
Akelle Kara
Curtidas 0
Respostas
Akelle Kara
17/11/2003
Sugestões?
GOSTEI 0
Marcelo Saviski
17/11/2003
Fiz essa função meio no grito e ficou legalzinha :)
Funciona com 2 ou + cores, não apenas 3
teste ela assim:
Funcionou?
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?
GOSTEI 0
Akelle Kara
17/11/2003
Funcionou muito bem, Valeu mesmo! :D
GOSTEI 0
Marco Antônio
17/11/2003
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
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
GOSTEI 0