程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Window畫圖程序中畫曲線的簡單實現

Window畫圖程序中畫曲線的簡單實現

編輯:Delphi

  下面是很入以前的一個程序,模仿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;

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved