Delphi

本类阅读TOP10

·游戏外挂设计技术探讨①
·如何使用Delphi设计强大的服务器程序
·分布式网络考试系统原型分析及实现
·用DLL方式封装MDI子窗体。
·使用HOOK随心监视Windows
·Delphi 水晶报表打包解决
·url编码与解码工具附代码
·工人线程中关闭窗体的实现
·hdsi2.0 sql注入部分抓包分析语句
·Borland Delphi 2005 下载

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
Window画图程序中画曲线的简单实现

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

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




相关文章

相关软件




月光软件程序下载编程文档电脑教程网站设计网址导航网络文学游戏天地幽默笑话生活休闲写作范文安妮宝贝
电脑技术编程开发网络专区谈天说地情感世界游戏元素分类游戏热门游戏体育运动手机专区业余爱好影视沙龙
音乐天地数码广场教育园地科学大观古今纵横谈股论金人文艺术医学保健动漫图酷二手专区地方风情各行各业

月光软件站·版权所有