再学 GDI+[14] DrawBeziers - 绘制一组贝塞尔线

 

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.

转载于:https://www.cnblogs.com/keyvip/archive/2010/12/31/1922819.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值