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

酸辣粉下啤酒

酸辣粉下啤酒

2016-02-19 16:22

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。
 

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  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;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  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.
  

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
Window画图程序中画曲线的简单实现

ASP中实现小偷程序的原理和简单

ASP
ASP中实现小偷程序的原理和简单

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

解析在Direct2D中画Bezier曲线的实现方法

编程语言 网络编程
解析在Direct2D中画Bezier曲线的实现方法

ASP中实现小偷程序的原理和简单示例

Web开发
ASP中实现小偷程序的原理和简单示例

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

VisualBasic实现在程序中开启网页

编程语言 网络编程
VisualBasic实现在程序中开启网页

在AJAX程序中实现互斥揭秘

Web开发
在AJAX程序中实现互斥揭秘

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

ASP入门基础教程-VBScript基本元素

ASP入门基础教程-VBScript基本元素

制作从屏幕右下角逐渐弹出的消息提示框

制作从屏幕右下角逐渐弹出的消息提示框
下拉加载更多内容 ↓