May 30, 2005

[Delphi] GDI+ LinearGradientBrush (6)

GradientPen

'TexturePen' のときと同じように、LinearGradientBrush を使って 'LinearGradientPen' をつくることができる。おもしろい。

土星の環を描くときは、適当なパターンを Bitmap につくって 'TexturePen' を利用したほうがいいかな。透明も設定できるし。

コードは
uses
  GDIPAPI, GDIPOBJ;

procedure TForm1.Button1Click(Sender: TObject);
const
  colors: array[0..6] of TGPColor = (aclRed,aclOrange,aclYellow,aclGreen,
                                                 aclBlue,aclIndigo,aclViolet);
var
  gr: TGPGraphics;
  lb: TGPLinearGradientBrush;
  pen: TGPPen;
  i: integer;
  Factor, Position: array[0..10] of Single;
begin
  lb := TGPLinearGradientBrush.Create(MakePoint(-152, 0), MakePoint(152, 0),
                                      aclNavy, aclLime);

  for i :=0 to 10 do
  begin
    Factor[i] := Random(11)*0.1;
    Position[i] := i*0.1;
  end;
  lb.SetBlend(@Factor[0], @Position[0], 11);

  lb.SetGammaCorrection(true);

  pen := TGPPen.Create(lb,1);

  gr := TGPGraphics.Create(Canvas.Handle);

  for i := 0 to 180 do
  begin
    gr.ResetTransform;
    gr.TranslateTransform(170,20+i);
    gr.ScaleTransform(cos(pi*i*2/180),1);
    gr.DrawLine(pen,-150,0,150,0);
  end;

  pen.Free;

  for i :=0 to 6 do Position[i] := 1/6*i;
  lb.SetInterpolationColors(@colors[0], @Position[0], 7);

  pen := TGPPen.Create(lb,1);

  for i := 0 to 180 do
  begin
    gr.ResetTransform;
    gr.TranslateTransform(170,220+i);
    gr.ScaleTransform(cos(pi*i*2/180),1);
    gr.DrawLine(pen,-150,0,150,0);
  end;

  gr.Free;
  pen.Free;
  lb.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;

この記事へのトラックバックURL