Welcome

首页 / 软件开发 / Delphi / 再学GDI+[50]: 路径 - GetPathPoints、GetPathTypes、TPathData

再学GDI+[50]: 路径 - GetPathPoints、GetPathTypes、TPathData2012-05-09 cnblogs 万一本例效果图:

代码文件:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses GDIPOBJ, GDIPAPI;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Align := alRight;
StringGrid1.FixedCols := 0;
StringGrid1.ColCount := 3;
StringGrid1.ColWidths[0] := 25;
StringGrid1.ColWidths[1] := 25;
StringGrid1.ColWidths[2] := 80;
StringGrid1.DefaultRowHeight := 20;
StringGrid1.Cells[0,0] := "X";
StringGrid1.Cells[1,0] := "Y";
StringGrid1.Cells[2,0] := "点类型";
end;
procedure TForm1.FormPaint(Sender: TObject);
var
g: TGPGraphics;
p: TGPPen;
path: TGPGraphicsPath;
points: array of TGPPoint;
types: PByte;
typestr: string;
i: Integer;
begin
g := TGPGraphics.Create(Canvas.Handle);
p := TGPPen.Create(aclRed);
path := TGPGraphicsPath.Create;
path.StartFigure;
path.AddRectangle(MakeRect(30,20,90,40));
path.AddEllipse(MakeRect(30,80,90,180));
path.CloseFigure;
g.DrawPath(p, path);
SetLength(points, path.GetPointCount);
GetMem(types, path.GetPointCount);
path.GetPathPoints(PGPPoint(points), Length(points));
path.GetPathTypes(types, Length(points));
StringGrid1.RowCount := Length(points) + 1;
for i := 0 to Length(points) - 1 do
begin
case types^ of
$00 : typestr := "路径起始点";
$01 : typestr := "直线点";
$03 : typestr := "贝塞尔线点";
$07 : typestr := "遮盖点";
$10 : typestr := "虚线点";
$20 : typestr := "路径标记";
$80 : typestr := "子路径结束点";
end;
StringGrid1.Cells[0, i+1] := IntToStr(points[i].X);
StringGrid1.Cells[1, i+1] := IntToStr(points[i].Y);
StringGrid1.Cells[2, i+1] := typestr;
Inc(types);
end;
Dec(types, Length(points));
FreeMem(types);
types := nil;
path.Free;
p.Free;
g.Free;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
var
x,y: Integer;
begin
x := StrToIntDef(StringGrid1.Cells[0,ARow], 0);
y := StrToIntDef(StringGrid1.Cells[1,ARow], 0);
Repaint;
Canvas.Brush.Color := clBlue;
Canvas.FillRect(Bounds(x-3,y-3,6,6));
Text := Format("%d,%d",[x,y]);
end;
end.