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

2016-02-19 16:22 38 1 收藏

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

【 tulaoshi.com - 编程语言 】

 

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

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

  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;

(本文来源于图老师网站,更多请访问http://www.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.
  

来源:http://www.tulaoshi.com/n/20160219/1611848.html

延伸阅读
标签: Web开发
上一篇文章讲了canvas的arc方法,这一篇讲和他有关的arcTo方法。 arc与arcTo,从名字都能看出来相似。arcTo也是画曲线的方法,而且他画出的曲线也是正圆的一段弧线。但他的参数和arc简直是不共戴天~ ctx.arcTo(x1,y1,x2,y2,radius);arcTo的参数中包括两个点,而且这两个点中并没有表示圆心的点,仅仅最后的参数是圆的半径,表示arcTo和圆有那...
标签: Web开发
在canvas画线条这篇文章中,我讲了画直线的方法,按理这篇画曲线的文章早该发了,但由于canvas画曲线比较特殊,我还没摸透,所以要一步步尝试。 canvas里画曲线的难点之一,就在于他连曲线的函数就有4个!分别是arc,arcTo,quadraticCurveTo,bezierCurveTo.我从最简单的arc方法讲起吧。 arc的作用是画一个正规的圆弧,可以是一个完整的圆,也可...
神仙鱼怎么画 神仙鱼的画法其实很简单,大致的轮廓即为一个三角形。神仙鱼身上的花纹除了常见的长条形以外,小朋友还可以按照自己的喜好来涂绘。在学会了一只神仙鱼的画法之后,小朋友们www.tulaoshi.com还可以通过海藻水泡等简笔画和多个神仙鱼简笔画组合成为一幅漂亮的海底世界画哦! 简单的神仙鱼简笔画图解 材料:纸、笔 步骤1:画...
标签: Web开发
前面的文章我已经讲了3种在canvas中画曲线的方法:arc,arcTo以及quadraticCurveTo.他们都有一个共同点,就是他们画的曲线都只能偏向一边,今天讲的bezierCurveTo与他们最大的不同点就是有两个控制点,即可以画出S形的曲线了。 bezierCurveTo,也就是所谓的贝赛尔曲线了,如果你学过某些画图工具,就能马上理解。 bezierCurveTo的语法如下 :...
在.NET框架下的C#语言,和其他.NET语言一样提供了很多强大的特性和机制.其中一些是全新的,而有些则是从以前的语言和平台上照搬过来的。然而,这种巧妙的结合产生了一些有趣的方法可以用来解决我们的问题。这篇文章将讲述如何利用这些奇妙的特性,用插件(plug-ins)机制建立可扩展的解决方案。后面也将提供一个简要的例子,你甚至可以用这个...

经验教程

621

收藏

9
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部