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

2016-02-19 16:22 29 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

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

  {$R *.dfm}

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

  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.
  

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

延伸阅读
下面的函数通过使用新的字符来替换原始的每一个字符而对值进行了加密。它先将每个字符转换为其对应的ASCII值,再使用一个偏量,然后将(加入偏量的)ASCII值转换回字符。这个偏量可以是从1到255之间的任何数。 PublicFunctionEncryptDecrypt(ByValValueAsString)AsString DimstrCharAsString DimintCountAsInteger DimintA...
----在大量的应用软件中,软件启动后一幅画面有几秒的信息显示,列出产品、平台、版本号和版权信息,称之为“启动程序时的闪烁屏幕”。在VisualBasic中是如何实现的呢?本文讨论生成启动屏幕的一种方法,并使之多彩化。做到启动屏幕在桌面停留时,提示文字在桌面上“流动”(如《东方快车》启动画面)。同时也可以实现流动文字的闪烁、变色等效果...
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。 一、创建动态控件: 为了对照,我们先来看一下静态控件的创建。 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件...
程序中readme是个.sos文件,点吉它实现如下: 基本实现如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Registry,shlobj, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Memo1: TMemo; Panel1: TPa...
用作者编写的椭圆类可以绘制任意方向的任意长短半轴椭圆,可以设置椭圆线型和粗细。 下面是利用CWzjEllipse类是绘制椭圆的代码: const double PI = 3.14159265; //获取绘图设备环境 CDC* pDC = GetDC(); //定义椭圆对象 CWzjEllipse ell; //绘制红色椭圆花瓣 for (int i = 0; i 4; i++) { //设置长短半轴长 ell.SetAB(80, 30); ...

经验教程

917

收藏

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