WEB开发网
开发学院软件开发Delphi Window画图程序中画曲线的简单实现 阅读

Window画图程序中画曲线的简单实现

 2006-02-04 13:56:42 来源:WEB开发网   
核心提示: 下面是很入以前的一个程序,模仿Windows的画图程序中画曲线.其实原理简单得要命 ,就是一个PolyBezier函数.那一位有兴趣的可以封装成一个类,方便以后用.unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Gra
 

下面是很入以前的一个程序,模仿Windows的画图程序中画曲线.其实原理简单得要命 ,就是一个PolyBezier函数.
那一位有兴趣的可以封装成一个类,方便以后用.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TStep=(sStartEnd,sCtrl1,sCtrl2);
  TForm1 = class(TForm)
   Button1: TButton;
   PRocedure FormCreate(Sender: TObject);
   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 }
   isDown:Boolean;
   isOK:Boolean;  //标识一次Bezier线的绘制是否完成
   Step:TStep; //指示到那个阶段了
   StartP:TPoint;  //以下是四个点坐标
   EndP:TPoint;
   CtrP1:TPoint;
   CtrP2:TPoint;
  public
   { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  self.DoubleBuffered:=true;
  isDown:=False;
  Step:=sStartEnd;
  isOK:=False;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  isDown:=true;
  if Button=mbLeft then
  begin
   if (Step=sStartEnd) then
   begin
    StartP.X:=X;
    StartP.Y:=Y;
    EndP:=Point(X,Y);
    isOK:=False;
   end
   else if (Step=sCtrl1)  then
   begin
    CtrP1:=Point(X,Y);
    CtrP2:=Point(X,Y);
   end
   else if (Step=sCtrl2)  then
   begin
    CtrP2:=Point(X,Y);
   end;
  end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if isDown and (Shift=[ssLeft]) then
  begin
   if (Step=sStartEnd) then
   begin
    EndP.X:=X;
    EndP.Y:=Y;
   end
   else if Step=sCtrl1 then
   begin
    CtrP1:=Point(X,Y);
    CtrP2:=Point(X,Y);
   end
   else if (Step=sCtrl2)  then
   begin
    CtrP2:=Point(X,Y);
   end;
   self.Invalidate;
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if isDown and (Button=mbLeft) then
  begin
   isDown:=False;
   if Step=sStartEnd then Step:=sCtrl1
   else if Step=sCtrl1 then Step:=sCtrl2
   else if Step=sCtrl2 then begin Step:=sStartEnd; isOK:=True; end;
  end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  if not isOK then
  begin
   if Step=sStartEnd then
   begin
    self.Canvas.MoveTo(StartP.X,StartP.Y);
    self.Canvas.LineTo(EndP.X,EndP.Y);
   end
   else begin
   Self.Canvas.PolyBezier([StartP,CtrP1,CtrP2,EndP]);
   end;
  end else begin
   Self.Canvas.PolyBezier([StartP,CtrP1,CtrP2,EndP]);
  end;
end;

end.

Tags:Window 画图 程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接