网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.先人的DELPHI基础开发技巧.
.如何用编程实现TDateTimePicker的.
.如何通过程序实现网卡的启用和禁.
.自定义的TShockwaveflash.
.代码重构——之获得封装性DELPHI.
.StatusBar有多个子栏时,如何确定.
.区分保留字跟关键字.
.平滑SpeedButton.
.准备迎接Kylix.
.用DELPHI实现NT环境下的绝对磁盘.
.在Delphi7中实现停靠功能.
.杀死一个正在运行的程序.
.Delphi操作Wrod的几个知识点.
.有的程序不能运行于win98的原因.
.组件制作之一(概念).
.使用ADO,多线程访问ACCESS数据库.
.DBGrid使用全书(四).
.“98五笔字型输入法”大批量造词.
.Delphi程序设计之--惯用法.
.一个设置任意窗口透明度的命令行.

控件移动类的实现之二

发表日期:2006-2-4


下面是TDragClass的源代码,比如多,可以拷去机上试试,再慢慢看:
 
//------TDragClass------------------------
unit uDrag;
 
interface
   uses  Windows, Messages,Classes,SysUtils,Controls,Graphics,
         uDragPoint,StdCtrls;
type
  //控件的八个点,用于拉动大小
    TPointRec=record
      LeftTop:TDragPoint;
      LeftBottom:TDragPoint;
      RightTop:TDragPoint;
      RightButton:TDragPoint;
      LeftMid:TDragPoint;
      TopMid:TDragPoint;
      RightMid:TDragPoint;
      ButtonMid:TDragPoint;
    end;
 
    TDragClass=class
    private
      FConList:TList;  //保存控件的列表
      FCurActiveCon:Integer;  //当前活动控件
      FPointRec:TPointRec; //当前控件的边缘的八个小点
      //跳跃式移动的成员
      FisMoveStep:Boolean;
      FMoveStep:integer;
      MoveX,MoveY:integer;
      //控件事件相关的成员
      FConMouseDown:TMouseEvent;
      FConMouseMove:TMouseMoveEvent;
      FConMouseup:TMouseEvent;
      isDown:Boolean;
      prevP,nextP:TPoint;
    protected
      //-------对移动点的操作--
      procedure CreateDragPoint(PointParent:TWinControl);
      procedure SetPointPos(posRect:TRect);
      procedure SetPointParent(PointParent:TWinControl);
      procedure SetPointEvent;
      procedure SetCurActiveCon(curCon:Pointer);
      //----------------------
      procedure MoveLeftTopPoint;
      procedure  AlignLeftTop;
      procedure MoveLeftBottomPoint;
      procedure  AlignLeftBottom;
      procedure MoveRightTopPoint;
      procedure AlignRightTop;
      procedure MoveRightBottomPoint;
      procedure AlignRightBottom;
      procedure MoveLeftMidPoint;
      procedure AlignLeftMid;
      procedure MoveTopMidPoint;
      procedure AlignTopMid;
      procedure MoveRightMidPoint;
      procedure AlignRightMid;
      procedure MoveBottomMidPoint;
      procedure AlignBottomMid;
      procedure reSizeCon;
      //当前控件事件和移动点事件处理------------
      procedure ConMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
      procedure ConMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
      procedure ConMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
      procedure PointMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
      procedure PointMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
      procedure PointMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
 
      procedure SetisMoveStep(value:Boolean);
      procedure SetMoveStep(value:integer);
    public
      constructor create(PointParent:TWinControl);
      destructor destroy; override;
      function addControl(AddCon:Pointer):Boolean;  //important
      procedure SetPointVisible(Visibled:Boolean);
      property isMoveStep:Boolean read FisMoveStep write SetisMoveStep;
      property MoveStep:Integer read FMoveStep write SetMoveStep;
    end;
 
implementation
 
{ TDragClass }
 
constructor TDragClass.create(PointParent:TWinControl);
begin
  inherited Create;
  FConList:=TList.Create;
  FCurActiveCon:=-1;
  isDown:=False;
  FisMoveStep:=False;
  FMoveStep:=5;
 
  FConMouseDown:=ConMouseDown;
  FConMouseMove:=ConMouseMove;
  FConMouseup:=ConMouseUp;
 
  CreateDragPoint(PointParent);
  SetPointVisible(false);
  SetPointEvent;
end;
 
destructor TDragClass.destroy;
begin
  FreeAndNil(FConList);
  FPointRec.LeftTop.Free;
  FPointRec.LeftBottom.Free;
  FPointRec.RightTop.Free;
  FPointRec.RightButton.Free;
  FPointRec.LeftMid.Free;
  FPointRec.TopMid.Free;
  FPointRec.RightMid.Free;
  FPointRec.ButtonMid.Free;
  inherited;
end;
//加一个控件进入拖拉类
function TDragClass.addControl(AddCon: Pointer): Boolean;
var TempCon:TControl; R:TRect;
    i:integer;
begin
  result:=True;
  if TControl(AddCon).Parent=nil then
  begin
    result:=false;
    exit;
  end;
  //如果该控件已经在列表中了,则加入失败
  for i:=0 to FConList.Count-1 do
    if Integer(AddCon)=Integer(FConList.Items[i]) then
    begin
      result:=false;
      exit;
    end;
  //将控件加入列表中,并指定当前的控件的索引
  FConList.Add(AddCon);
  FCurActiveCon:=FConList.Count-1;
  TempCon:=TControl(AddCon);
  TempCon.Cursor:=crSizeAll;
  TempCon.Parent.DoubleBuffered:=True;  //使用双缓冲技术
  //折中方案,指定控件鼠标事件
  TButton(TempCon).OnMouseDown:=FconMouseDown;
  TButton(TempCon).OnMouseMove:=FconMouseMove;
  TButton(TempCon).OnMouseUp:=FconMouseUp;
  //画控件周围的八个小点
  R.Left:=TempCon.Left;
  R.Top:=TempCon.Top;
  R.Right:=TempCon.Left+TempCon.Width;
  R.Bottom:=TempCon.Top+TempCon.Height;
  SetPointParent(TempCon.Parent);
  SetPointPos(R);
  SetPointVisible(true);
end;
//设置八小点的可见性
procedure TDragClass.SetPointVisible(Visibled: Boolean);
begin
  FPointRec.LeftTop.Visible:=Visibled;
  FPointRec.LeftBottom.Visible:=Visibled;
  FPointRec.RightTop.Visible:=Visibled;
  FPointRec.RightButton.Visible:=Visibled;
  FPointRec.LeftMid.Visible:=Visibled;
  FPointRec.TopMid.Visible:=Visibled;
  FPointRec.RightMid.Visible:=Visibled;
  FPointRec.ButtonMid.Visible:=Visibled;
end;
//设置小点事件
procedure TDragClass.SetPointEvent;
begin
  FPointRec.LeftTop.OnMouseDown:=PointMouseDown;
  FPointRec.LeftTop.OnMouseMove:=PointMouseMove;
  FPointRec.LeftTop.onMouseUp:=PointMouseUp;
  FPointRec.LeftBottom.OnMouseDown:=PointMouseDown;
  FPointRec.LeftBottom.OnMouseMove:=PointMouseMove;
  FPointRec.LeftBottom.onMouseUp:=PointMouseUp;
  FPointRec.RightTop.OnMouseDown:=PointMouseDown;
  FPointRec.RightTop.OnMouseMove:=PointMouseMove;
  FPointRec.RightTop.onMouseUp:=PointMouseUp;
  FPointRec.RightButton.OnMouseDown:=PointMouseDown;
  FPointRec.RightButton.OnMouseMove:=PointMouseMove;
  FPointRec.RightButton.onMouseUp:=PointMouseUp;
  FPointRec.LeftMid.OnMouseDown:=PointMouseDown;
  FPointRec.LeftMid.OnMouseMove:=PointMouseMove;
  FPointRec.LeftMid.onMouseUp:=PointMouseUp;
  FPointRec.TopMid.OnMouseDown:=PointMouseDown;
  FPointRec.TopMid.OnMouseMove:=PointMouseMove;
  FPointRec.TopMid.onMouseUp:=PointMouseUp;
  FPointRec.RightMid.OnMouseDown:=PointMouseDown;
  FPointRec.RightMid.OnMouseMove:=PointMouseMove;
  FPointRec.RightMid.onMouseUp:=PointMouseUp;
  FPointRec.ButtonMid.OnMouseDown:=PointMouseDown;
  FPointRec.ButtonMid.OnMouseMove:=PointMouseMove;
  FPointRec.ButtonMid.onMouseUp:=PointMouseUp;
end;
//确定控件边缘八个小点的位置
procedure TDragClass.SetPointPos(posRect: TRect);
begin
  FPointRec.LeftTop.Left:=posRect.Left-6;
  FPointRec.LeftTop.Top:=posRect.Top-6;
 
  FPointRec.LeftBottom.Left:=PosRect.Left-6;
  FPointRec.LeftBottom.Top:=PosRect.Bottom;
 
  FPointRec.RightTop.Left:=posRect.Right;
  FPointRec.RightTop.Top:=posRect.Top-6;
 
  FPointRec.RightButton.Left:=PosRect.Right;
  FPointRec.RightButton.Top:=PosRect.Bottom;
 
  FPointRec.LeftMid.Left:=posRect.Left-6;
  FPointRec.LeftMid.Top:=(posRect.Top+posRect.Bottom) div 2 - 3;
 
  FPointRec.TopMid.Left:=(posRect.Left+posRect.Right) div 2 -3;
  FPointRec.TopMid.Top:=PosRect.Top-6;
 
  FPointRec.RightMid.Left:=posRect.Right;
  FPointRec.RightMid.Top:=(posRect.Top+posRect.Bottom) div 2 - 3;
 
  FPointRec.ButtonMid.Left:=(posRect.Left+posRect.Right) div 2 -3;
  FPointRec.ButtonMid.Top:=PosRect.Bottom;
end;
//创建八个小点
procedure TDragClass.CreateDragPoint(PointParent:TWinControl);
begin
  FPointRec.LeftTop:=TDragPoint.Create(nil);
  FPointRec.LeftTop.Cursor:=crSizeNWSE;
  FPointRec.LeftBottom:=TDragPoint.Create(nil);
  FPointRec.LeftBottom.Cursor:=crSizeNESW;
  FPointRec.RightTop:=TDragPoint.Create(nil);
  FPointRec.RightTop.Cursor:=crSizeNESW;
  FPointRec.RightButton:=TDragPoint.Create(nil);
  FPointRec.RightButton.Cursor:=crSizeNWSE;
  FPointRec.LeftMid:=TDragPoint.Create(nil);
  FPointRec.LeftMid.Cursor:=crSizeWE;
  FPointRec.TopMid:=TDragPoint.Create(nil);
  FPointRec.TopMid.Cursor:=crSizeNS;
  FPointRec.RightMid:=TDragPoint.Create(nil);
  FPointRec.RightMid.Cursor:=crSizeWE;
  FPointRec.ButtonMid:=TDragPoint.Create(nil);
  FPointRec.ButtonMid.Cursor:=crSizeNS;
  SetPointParent(PointParent);
end;
//------当前控件事件处理-------------------------
//处理点下的事件
procedure TDragClass.ConMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var TempCon:TControl; R:TRect;
begin
  if Button=mbLeft then
  begin
       isDown:=True;
       GetCursorPos(PrevP);
  end;
   TempCon:=TControl(Sender);
   SetPointParent(TempCon.Parent);
   R.Left:=TempCon.Left;
   R.Top:=TempCon.Top;
   R.Right:=TempCon.Left+TempCon.Width;
   R.Bottom:=TempCon.Top+TempCon.Height;
   MoveX:=0; MoveY:=0;
   SetPointPos(R);
   SetPointvisible(true);
   SetCurActiveCon(TempCon);
end;
//处理当前控件移动的消息
procedure TDragClass.ConMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var offsetX,offsetY:integer; con:TControl;
    r:TRect;
begin
  if isDown and (Shift=[ssLeft])then
  begin
     GetCursorPos(nextP);
     offsetX:=NextP.X-PrevP.X;
     offSetY:=NextP.Y-PrevP.Y;
     Con:=TControl(Sender);
     if not FisMoveStep then
     begin
       Con.Left:=Con.Left+offSetX;
       Con.Top:=Con.Top+offSetY;
     end
     else begin
       MoveX:=MoveX+offsetX;
       MoveY:=MoveY+offsetY;
       if Abs(MoveX)>=FMoveStep then
       begin
         Con.Left:=Con.Left+MoveX;
         MoveX:=0;
       end;
       if Abs(MoveY)>FMoveStep then
       begin
         Con.Top:=Con.Top+MoveY;
         MoveY:=0;
       end;
     end;
     R.Left:=Con.Left;
     R.Top:=Con.Top;
     R.Right:=Con.Left+Con.Width;
     R.Bottom:=Con.Top+Con.Height;
     SetPointPos(R);
     prevP:=nextP;
  end;
end;
//处理当前控件鼠标弹起的消息
procedure TDragClass.ConMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   isDown:=False;
end;
//------------------------
 //设置八个点的父子关系
procedure TDragClass.SetPointParent(PointParent: TWinControl);
begin
   FPointRec.LeftTop.Parent:=PointParent;
   FPointRec.LeftBottom.Parent:=PointParent;
   FPointRec.RightTop.Parent:=PointParent;
   FPointRec.RightButton.Parent:=PointParent;
   FPointRec.LeftMid.Parent:=PointParent;
   FPointRec.TopMid.Parent:=PointParent;
   FPointRec.RightMid.Parent:=PointParent;
   FPointRec.ButtonMid.Parent:=PointParent;
end;
//得到当前活动窗口
procedure TDragClass.SetCurActiveCon(curCon: Pointer);
var i:integer;
begin
  for i:=0 to FConList.Count-1 do
   if Integer(curCon)=Integer(FConList.Items[i]) then
   begin
     FCurActiveCon:=i;
     break;
   end;
end;
//----------------------------------
//八个小点的处理消息
procedure TDragClass.PointMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button= mbLeft then
  begin
    moveX:=0; moveY:=0;
    if Sender=FPointRec.LeftTop then
    begin
      FpointRec.LeftTop.isDown:=True;
      GetCursorPos(FPointRec.LeftTop.PrevP);
    end
    else if Sender=FPointRec.RightTop then
    begin
      FpointRec.RightTop.isDown:=True;
      GetCursorPos(FPointRec.RightTop.PrevP);
    end
    else if Sender=FPointRec.LeftBottom then
    begin
      FpointRec.LeftBottom.isDown:=True;
      GetCursorPos(FPointRec.LeftBottom.PrevP);
    end
    else if Sender=FPointRec.RightButton then
    begin
      FpointRec.RightButton.isDown:=True;
      GetCursorPos(FPointRec.RightButton.PrevP);
    end
    else if Sender=FPointRec.LeftMid then
    begin
      FpointRec.LeftMid.isDown:=True;
      GetCursorPos(FPointRec.LeftMid.PrevP);
    end
    else if Sender=FPointRec.TopMid then
    begin
      FpointRec.TopMid.isDown:=True;
      GetCursorPos(FPointRec.TopMid.PrevP);
    end
    else if Sender=FPointRec.RightMid then
    begin
      FpointRec.RightMid.isDown:=True;
      GetCursorPos(FPointRec.RightMid.PrevP);
    end
    else if Sender=FPointRec.ButtonMid then
    begin
      FpointRec.ButtonMid.isDown:=True;
      GetCursorPos(FPointRec.ButtonMid.PrevP);
    end;
  end;
end;
 
procedure TDragClass.PointMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Shift=[ssLeft] then
  begin
    if FPointRec.LeftTop.isDown  then
    begin
     MoveLeftTopPoint;
     reSizeCon
    end
    else if FPointRec.LeftBottom.isDown then
    begin
     MoveLeftBottomPoint;
     reSizeCon
    end
    else if FPointRec.RightTop.isDown then
    begin
     MoveRightTopPoint;
     reSizeCon
    end
    else if FPointRec.RightButton.isDown then
    begin
     MoveRightBottomPoint;
     reSizeCon
    end
    else if FPointRec.LeftMid.isDown then
    begin
     MoveLeftMidPoint;
     reSizeCon
    end
    else if FPointRec.TopMid.isDown then
    begin
     MoveTopMidPoint;
     reSizeCon
    end
    else if FPointRec.RightMid.isDown then
    begin
     MoveRightMidPoint;
     reSizeCon
    end
    else if FPointRec.ButtonMid.isDown then
    begin
     MoveBottomMidPoint;
     reSizeCon
    end
  end;
end;
 
procedure TDragClass.PointMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if Button= mbLeft then
   begin
     if (FpointRec.LeftTop.isDown) and
     (Sender=FpointRec.LeftTop) then
       FpointRec.LeftTop.isDown:=False
     else if (FpointRec.LeftBottom.isDown) and
     (Sender=FpointRec.LeftBottom) then
       FpointRec.LeftBottom.isDown:=False
     else if (FpointRec.RightTop.isDown) and
     (Sender=FpointRec.RightTop) then
       FpointRec.RightTop.isDown:=False
       else if (FpointRec.RightButton.isDown) and
     (Sender=FpointRec.RightButton) then
       FpointRec.RightButton.isDown:=False
     else if (FpointRec.LeftMid.isDown) and
     (Sender=FpointRec.LeftMid) then
       FpointRec.LeftMid.isDown:=False
     else if (FpointRec.TopMid.isDown) and
     (Sender=FpointRec.TopMid) then
       FpointRec.TopMid.isDown:=False
     else if (FpointRec.RightMid.isDown) and
     (Sender=FpointRec.RightMid) then
       FpointRec.RightMid.isDown:=False
     else if (FpointRec.ButtonMid.isDown) and
     (Sender=FpointRec.ButtonMid) then
       FpointRec.ButtonMid.isDown:=False;
   end;
end;
//左顶点的移动
procedure TDragClass.MoveLeftTopPoint;
var offsetX,offsetY:Integer;
begin
     GetCursorPos(FPointRec.LeftTop.NextP);
     offsetX:=FPointRec.LeftTop.NextP.X-FPointRec.LeftTop.PrevP.X;
     offSetY:=FPointRec.LeftTop.NextP.Y-FPointRec.LeftTop.PrevP.Y;
     if not FisMoveStep then
     begin
       FPointRec.LeftTop.Left:=FPointRec.LeftTop.Left+offsetX;
       FPointRec.LeftTop.Top:=FPointRec.LeftTop.Top+offsetY;
     end
     else begin
       MoveX:=MoveX+offsetX;
       MoveY:=MoveY+offsetY;
       if Abs(moveX)>=FMoveStep then
       begin
         FPointRec.LeftTop.Left:=FPointRec.LeftTop.Left+moveX;
         moveX:=0;
       end;
       if Abs(moveY)>=FMoveStep then
       begin
         FPointRec.LeftTop.Top:=FPointRec.LeftTop.Top+moveY;
         moveY:=0;
       end;
     end;
     FPointRec.LeftTop.PrevP:=FPointRec.LeftTop.NextP;
     AlignLeftTop;
end;
//其他点对齐左右点
procedure TDragClass.AlignLeftTop;
begin
   FPointRec.LeftBottom.Left:=FPointRec.LeftTop.Left;
   FPointRec.RightTop.Top:=FPointRec.LeftTop.Top;
   FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=
     (FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:=
     (FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.RightMid.Top:=
     (FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
   FPointRec.ButtonMid.Left:=
     (FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;
//对齐点
procedure TDragClass.AlignLeftBottom;
begin
   FPointRec.LeftTop.Left:=FPointRec.LeftBottom.Left;
   FPointRec.RightButton.Top:=FPointRec.LeftBottom.Top;
    FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=
     (FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:=
     (FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.RightMid.Top:=
     (FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
   FPointRec.ButtonMid.Top:=FPointrec.LeftBottom.Top;
   FPointRec.ButtonMid.Left:=
     (FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;
//移动左底点
procedure TDragClass.MoveLeftBottomPoint;
var offsetX,offsetY:Integer;
begin
     GetCursorPos(FPointRec.LeftBottom.NextP);
     offsetX:=FPointRec.LeftBottom.NextP.X-FPointRec.LeftBottom.PrevP.X;
     offSetY:=FPointRec.LeftBottom.NextP.Y-FPointRec.LeftBottom.PrevP.Y;
     if not FisMoveStep then
     begin
       FPointRec.LeftBottom.Left:=FPointRec.LeftBottom.Left+offsetX;
       FPointRec.LeftBottom.Top:=FPointRec.LeftBottom.Top+offsetY;
     end
     else begin
       MoveX:=MoveX+offsetX;
       MoveY:=MoveY+offsetY;
       if Abs(moveX)>=FMoveStep then
       begin
         FPointRec.LeftBottom.Left:=FPointRec.LeftBottom.Left+moveX;
         moveX:=0;
       end;
       if Abs(moveY)>=FMoveStep then
       begin
         FPointRec.LeftBottom.Top:=FPointRec.LeftBottom.Top+moveY;
         movey:=0;
       end;
     end;
     FPointRec.LeftBottom.PrevP:=FPointRec.LeftBottom.NextP;
     AlignLeftBottom;
end;
//对齐点
procedure TDragClass.AlignRightTop;
begin
   FPointRec.LeftTop.Top:=FPointRec.RightTop.top;
   FPointRec.RightButton.Left:=FPointRec.RightTop.Left;
   FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=
     (FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:=
     (FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.RightMid.Left:=FPointRec.RightTop.Left;
   FPointRec.RightMid.Top:=
     (FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
   FPointRec.ButtonMid.Top:=FPointrec.LeftBottom.Top;
   FPointRec.ButtonMid.Left:=
     (FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;
//移动右上点
procedure TDragClass.MoveRightTopPoint;
var offsetX,offsetY:Integer;
begin
     GetCursorPos(FPointRec.RightTop.NextP);
     offsetX:=FPointRec.RightTop.NextP.X-FPointRec.RightTop.PrevP.X;
     offSetY:=FPointRec.RightTop.NextP.Y-FPointRec.RightTop.PrevP.Y;
     if not FisMoveStep then
     begin
       FPointRec.RightTop.Left:=FPointRec.RightTop.Left+offsetX;
       FPointRec.RightTop.Top:=FPointRec.RightTop.Top+offsetY;
     end
     else begin
       MoveX:=MoveX+offsetX;
       MoveY:=MoveY+offsetY;
       if Abs(moveX)>=FMoveStep then
       begin
         FPointRec.RightTop.Left:=FPointRec.RightTop.Left+moveX;
         moveX:=0;
       end;
       if Abs(moveY)>=FMoveStep then
       begin
         FPointRec.RightTop.Top:=FPointRec.RightTop.Top+moveY;
         moveY:=0;
       end;
     end;
     FPointRec.RightTop.PrevP:=FPointRec.RightTop.NextP;
     AlignRightTop;
end;
//对齐点
procedure TDragClass.AlignRightBottom;
begin
   FPointRec.LeftBottom.Top:=FPointRec.RightButton.top;
   FPointRec.RightTop.Left:=FPointRec.RightButton.Left;
   FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=
     (FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:=
     (FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.RightMid.Left:=FPointRec.RightTop.Left;
   FPointRec.RightMid.Top:=
     (FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
   FPointRec.ButtonMid.Top:=FPointrec.LeftBottom.Top;
   FPointRec.ButtonMid.Left:=
     (FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;
//移动右底点
procedure TDragClass.MoveRightBottomPoint;
var offsetX,offsetY:Integer;
begin
     GetCursorPos(FPointRec.RightButton.NextP);
     offsetX:=FPointRec.RightButton.NextP.X-FPointRec.RightButton.PrevP.X;
     offSetY:=FPointRec.RightButton.NextP.Y-FPointRec.RightButton.PrevP.Y;
     if not FisMoveStep then
     begin
       FPointRec.RightButton.Left:=FPointRec.RightButton.Left+offsetX;
       FPointRec.RightButton.Top:=FPointRec.RightButton.Top+offsetY;
     end
     else begin
       MoveX:=MoveX+offsetX;
       MoveY:=MoveY+offsetY;
       if Abs(moveX)>=FMoveStep then
       begin
         FPointRec.RightButton.Left:=FPointRec.RightButton.Left+moveX;
         moveX:=0;
       end;
       if Abs(moveY)>=FMoveStep then
       begin
         FPointRec.RightButton.Top:=FPointRec.RightButton.Top+moveY;
         moveY:=0;
       end;
     end;
     FPointRec.RightButton.PrevP:=FPointRec.RightButton.NextP;
     AlignRightBottom;
end;
//对齐点
procedure TDragClass.AlignLeftMid;
begin
   FPointRec.LeftTop.Left:=FPointRec.LeftMid.Left;
   FPointRec.LeftBottom.Left:=FPointRec.LeftMid.Left;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:=
     (FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.ButtonMid.Top:=FPointrec.LeftBottom.Top;
   FPointRec.ButtonMid.Left:=
     (FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;
//左中点
procedure TDragClass.MoveLeftMidPoint;
var offsetX:Integer;
begin
     GetCursorPos(FPointRec.LeftMid.NextP);
     offsetX:=FPointRec.LeftMid.NextP.X-FPointRec.LeftMid.PrevP.X;
     if not FisMoveStep then
     begin
       FPointRec.LeftMid.Left:=FPointRec.LeftMid.Left+offsetX;
     end
     else begin
       MoveX:=MoveX+offsetX;
       if Abs(moveX)>=FMoveStep then
       begin
         FPointRec.LeftMid.Left:=FPointRec.LeftMid.Left+moveX;
         moveX:=0;
       end;
     end;
     FPointRec.LeftMid.PrevP:=FPointRec.LeftMid.NextP;
     AlignLeftMid;
end;
//对齐点
procedure TDragClass.AlignTopMid;
begin
   FPointRec.LeftTop.Top:=FPointRec.TopMid.Top;
   FPointRec.RightTop.Top:=FPointRec.TopMid.Top;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=
     (FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.RightMid.Left:=FPointRec.RightTop.Left;
   FPointRec.RightMid.Top:=
     (FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
end;
//顶中点
procedure TDragClass.MoveTopMidPoint;
var offsetY:Integer;
begin
     GetCursorPos(FPointRec.TopMid.NextP);
     offSetY:=FPointRec.TopMid.NextP.Y-FPointRec.TopMid.PrevP.Y;
     if not FisMoveStep then
     begin
       FPointRec.TopMid.Top:=FPointRec.TopMid.Top+offsetY;
     end
     else begin
       MoveY:=MoveY+offsetY;
       if Abs(moveY)>=FMoveStep then
       begin
         FPointRec.TopMid.Top:=FPointRec.TopMid.Top+moveY;
         moveY:=0;
       end;
     end;
     FPointRec.TopMid.PrevP:=FPointRec.TopMid.NextP;
     AlignTopMid;
end;
//对齐点
procedure TDragClass.AlignRightMid;
begin
   FPointRec.RightTop.Left:=FPointRec.RightMid.Left;
   FPointRec.RightButton.Left:=FPointRec.RightMid.Left;
   FPointRec.TopMid.Top:=FPointRec.LeftTop.Top;
   FPointRec.TopMid.Left:=
     (FPointRec.RightTop.Left+FPointRec.LeftTop.Left) div 2;
   FPointRec.ButtonMid.Top:=FPointrec.LeftBottom.Top;
   FPointRec.ButtonMid.Left:=
     (FPointRec.LeftBottom.Left+FPointRec.RightButton.Left) div 2;
end;
//右中点
procedure TDragClass.MoveRightMidPoint;
var offsetX:Integer;
begin
     GetCursorPos(FPointRec.RightMid.NextP);
     offsetX:=FPointRec.RightMid.NextP.X-FPointRec.RightMid.PrevP.X;
     if not FisMoveStep then
     begin
       FPointRec.RightMid.Left:=FPointRec.RightMid.Left+offsetX;
     end
     else begin
       MoveX:=MoveX+offsetX;
       if Abs(moveX)>=FMoveStep then
       begin
         FPointRec.RightMid.Left:=FPointRec.RightMid.Left+moveX;
         moveX:=0;
       end;
     end;
     FPointRec.RightMid.PrevP:=FPointRec.RightMid.NextP;
     AlignRightMid;
end;
//对齐点
procedure TDragClass.AlignBottomMid;
begin
   FPointRec.LeftBottom.Top:=FPointRec.ButtonMid.Top;
   FPointRec.RightButton.Top:=FPointrec.ButtonMid.Top;
   FPointRec.LeftMid.Left:=FPointRec.LeftTop.Left;
   FPointRec.LeftMid.Top:=
     (FPointRec.LeftBottom.Top+FPointRec.LeftTop.Top) div 2;
   FPointRec.RightMid.Left:=FPointRec.RightTop.Left;
   FPointRec.RightMid.Top:=
     (FPointRec.RightTop.Top+FPointRec.RightButton.Top) div 2;
end;
//底中点
procedure TDragClass.MoveBottomMidPoint;
var offsetY:Integer;
begin
     GetCursorPos(FPointRec.ButtonMid.NextP);
     offSetY:=FPointRec.ButtonMid.NextP.Y-FPointRec.ButtonMid.PrevP.Y;
     if not FisMoveStep then
     begin
       FPointRec.ButtonMid.Top:=FPointRec.ButtonMid.Top+offsetY;
     end
     else begin
       MoveY:=MoveY+offsetY;
       if Abs(moveY)>=FMoveStep then
       begin
         FPointRec.ButtonMid.Top:=FPointRec.ButtonMid.Top+moveY;
         moveY:=0;
       end;
     end;
     FPointRec.ButtonMid.PrevP:=FPointRec.ButtonMid.NextP;
     AlignBottomMid;
end;
//重定位控件的尽寸
procedure TDragClass.reSizeCon;
var Con:TControl;
begin
  Con:=TControl(FConList.Items[FCurActiveCon]);
  Con.Left:=FPointRec.LeftTop.Left+FPointRec.LeftTop.Width;
  Con.Top:=FPointRec.LeftTop.Top+FPointRec.LeftTop.Height;
  Con.Width:=FPointRec.RightTop.Left-Con.Left;
  Con.Height:=FPointRec.LeftBottom.Top-Con.Top;
end;
//-----------------------------------------------
//设置控件移动时是否用跳跃式的移动
procedure TDragClass.SetisMoveStep(value: Boolean);
begin
  if FisMoveStep<>value then
    FisMoveStep:=Value;
end;
//设置控件移动跳跃的距离
procedure TDragClass.SetMoveStep(value: integer);
begin
  if Value<5 then
     FMoveStep:=5
  else if Value>20 then
     FMoveStep:=20
  else
     FMoveStep:=Value;
end;
 
end.
上一篇:控件移动类的实现之一 人气:4632
下一篇:Delphi中MIDAS是什么(MIDAS之一) 人气:5236
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐