unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
GDIPOBJ,GDIPAPI;
var
pts:array of TGPPoint;
ptn:Integer = -1;
flag:Boolean;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
flag:=True;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
i:Integer;
R:TRect;
begin
if flag then
begin
if ptn = -1 then Exit;
pts[ptn]:=MakePoint(x,y);
Repaint;
end
else
begin
ptn:=-1;
Cursor:=crDefault;
for I := Low(pts) to High(pts) do
begin
R:=Rect(pts[i].X-2,pts[i].Y-2,pts[i].X+2,pts[i].Y+2);
if PtInRect(R,Point(x,y)) then
begin
ptn:=i;
Cursor:=crHandPoint;
end;
end;
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
flag:=False;
if ssCtrl in Shift then
begin
SetLength(pts,Length(pts)+1);
pts[High(pts)]:=MakePoint(x,y);
Canvas.Pen.Color:=clBlue;
Canvas.Rectangle(x-2,y-2,x+2,y+2);
Repaint; //万老师博客上是if Length(pts) mod 3 = 1 then Repaint; ,这个其实不需要这样
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
g:TGPGraphics;
p:TGPPen;
i:Integer;
begin
Form1.DoubleBuffered:=True;
g:=TGPGraphics.Create(Canvas.Handle);
g.Clear(aclWhite);
p:=TGPPen.Create(aclRed);
g.DrawBeziers(p,PGPPoint(pts),Length(pts));
p.SetColor(aclBlue);
for I := Low(pts) to High(pts) do
begin
g.DrawRectangle(p,MakeRect(Rect(pts[i].X-2,pts[i].Y-2,pts[i].X+2,pts[i].Y+2)));
end;
p.Free;
g.Free;
end;
end.