多色渐变需要: 一个 "颜色数组" 和一个 "位置数组" (0-1 之间的位置比例);
IGPLinearGradientBrush.InterpolationColors 属性对应一个 IGPColorBlend 对象, 此对象专门用于装载上面两个数组.
IGPColorBlend 的 Colors 和 Positions 两个属性分别对应这两个数组.
下面的三个示例的结果都是一样的.
测试效果图:
测试一, 使用开放数组参数构建 IGPColorBlend
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); const C1 = $FF000000; C2 = $FFFF0000; C3 = $FFFFFF00; C4 = $FFFF0000; C5 = $FF000000; var Graphics: IGPGraphics; Rect: TGPRect; Brush: IGPLinearGradientBrush; ColorBlend: IGPColorBlend; begin Graphics := TGPGraphics.Create(Canvas.Handle); Rect.Initialize(ClientRect); Brush := TGPLinearGradientBrush.Create(Rect, 0, 0, 0); ColorBlend := TGPColorBlend.Create([C1, C2, C3, C4, C5], [0, 0.25, 0.5, 0.75, 1]); Brush.InterpolationColors := ColorBlend; Graphics.FillRectangle(Brush, Rect); end; procedure TForm1.FormResize(Sender: TObject); begin Repaint; end;
测试二, 使用静态数组参数构建 IGPColorBlend:
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Rect: TGPRect; Brush: IGPLinearGradientBrush; ColorBlend: IGPColorBlend; cs: array[0..4] of TGPColor; ps: array[0..4] of Single; begin Graphics := TGPGraphics.Create(Canvas.Handle); Rect.Initialize(ClientRect); Brush := TGPLinearGradientBrush.Create(Rect, 0, 0, 0); cs[0] := $FF000000; cs[1] := $FFFF0000; cs[2] := $FFFFFF00; cs[3] := $FFFF0000; cs[4] := $FF000000; ps[0] := 0; ps[1] := 0.25; ps[2] := 0.5; ps[3] := 0.75; ps[4] := 1; ColorBlend := TGPColorBlend.Create(cs, ps); Brush.InterpolationColors := ColorBlend; Graphics.FillRectangle(Brush, Rect); end; procedure TForm1.FormResize(Sender: TObject); begin Repaint; end;
测试三, 使用数组常量或动态数组参数构建 IGPColorBlend:
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); const ps: array[0..4] of Single = (0, 0.25, 0.5, 0.75, 1); var Graphics: IGPGraphics; Rect: TGPRect; Brush: IGPLinearGradientBrush; ColorBlend: IGPColorBlend; cs: array of TGPColor; begin Graphics := TGPGraphics.Create(Canvas.Handle); Rect.Initialize(ClientRect); Brush := TGPLinearGradientBrush.Create(Rect, 0, 0, 0); SetLength(cs, 5); cs[0] := $FF000000; cs[1] := $FFFF0000; cs[2] := $FFFFFF00; cs[3] := $FFFF0000; cs[4] := $FF000000; ColorBlend := TGPColorBlend.Create(cs, ps); Brush.InterpolationColors := ColorBlend; Graphics.FillRectangle(Brush, Rect); end; procedure TForm1.FormResize(Sender: TObject); begin Repaint; end;