<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      Window畫圖程序中畫曲線的容易完成

      [摘要]下面是很入以前的一個程序,模仿Windows的畫圖程序中畫曲線.其實原理簡單得要命 ,就是一個PolyBezier函數.那一位有興趣的可以封裝成一個類,方便以后用.unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Cl...
      下面是很入以前的一個程序,模仿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.




      日韩精品一区二区三区高清