随笔 - 2146  文章 - 97 评论 - 11765 trackbacks - 253


自定义线帽可以通过两个接口: IGPCustomLineCap、IGPAdjustableArrowCap.

后者继承与前者, 专用于修改箭头线帽.

IGPAdjustableArrowCap 测试效果图:



IGPAdjustableArrowCap 测试代码:

uses GdiPlus;

procedure TForm1.FormPaint(Sender: TObject);
var
  Graphics: IGPGraphics;
  Pen: IGPPen;
  Cap1,Cap2: IGPAdjustableArrowCap;
begin
  Graphics := TGPGraphics.Create(Handle);
  Pen := TGPPen.Create($FFDC143C, 4);

  Cap1 := TGPAdjustableArrowCap.Create(4, 4);
  Cap2 := TGPAdjustableArrowCap.Create(4, 4, False);
  Pen.CustomStartCap := Cap1;
  Pen.CustomEndCap := Cap2;
  Graphics.DrawLine(Pen, 30, 30, 250, 30);

  Cap1 := TGPAdjustableArrowCap.Create(4, 8);
  Cap2 := TGPAdjustableArrowCap.Create(4, 8, False);
  Pen.CustomStartCap := Cap1;
  Pen.CustomEndCap := Cap2;
  Graphics.DrawLine(Pen, 30, 80, 250, 80);
end;


IGPCustomLineCap 测试效果图:



IGPCustomLineCap 测试代码:

uses GdiPlus;

procedure TForm1.FormPaint(Sender: TObject);
const
  pts: array[0..3] of TGPPoint = ((X:-4; Y:0),(X:0; Y:-4),(X:4; Y:0),(X:0; Y:8));
var
  Graphics: IGPGraphics;
  Pen: IGPPen;
  Path1,Path2: IGPGraphicsPath;
  Cap1,Cap2: IGPCustomLineCap;
  Pt1,Pt2: TGPPoint;
begin
  Graphics := TGPGraphics.Create(Handle);

  Path1 := TGPGraphicsPath.Create;
  Path1.AddEllipse(TGPRect.Create(-3, -3, 6, 6));

  Path2 := TGPGraphicsPath.Create;
  Path2.AddPolygon(pts);

  Pt1.Initialize(50, 30);
  Pt2.Initialize(50, 150);

  Pen := TGPPen.Create($FF8B0000, 3);

  //
  Cap1 := TGPCustomLineCap.Create(nil, Path1);
  Cap2 := TGPCustomLineCap.Create(nil, Path2);
  Pen.CustomStartCap := Cap1;
  Pen.CustomEndCap := Cap2;
  Graphics.DrawLine(Pen, Pt1, Pt2);
  Graphics.TranslateTransform(Pt1.X, 0);

  //
  Cap1 := TGPCustomLineCap.Create(nil, Path1, LineCapFlat, 3);
  Cap2 := TGPCustomLineCap.Create(nil, Path2, LineCapFlat, 4);
  Pen.CustomStartCap := Cap1;
  Pen.CustomEndCap := Cap2;
  Graphics.DrawLine(Pen, Pt1, Pt2);
  Graphics.TranslateTransform(Pt1.X, 0);

  //注意: 使用填充路径时, 对构建路径的参数要求比较古怪...
  Cap1 := TGPCustomLineCap.Create(Path1, nil);
  Cap2 := TGPCustomLineCap.Create(Path2, nil);
  Pen.CustomStartCap := Cap1;
  Pen.CustomEndCap := Cap2;
  Graphics.DrawLine(Pen, Pt1, Pt2);
  Graphics.TranslateTransform(Pt1.X, 0);

  //
  Cap1 := TGPCustomLineCap.Create(Path1, nil);
  Cap2 := TGPCustomLineCap.Create(Path2, nil);
  Cap1.WidthScale := 0.75;
  Cap2.WidthScale := 1.3;
  Pen.CustomStartCap := Cap1;
  Pen.CustomEndCap := Cap2;
  Graphics.DrawLine(Pen, Pt1, Pt2);
end;

posted on 2009-12-16 15:14 万一 阅读(...) 评论(...) 编辑 收藏