自定义线帽可以通过两个接口: 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;