控件移动类的实现之二

类别:Delphi 点击:0 评论:0 推荐:

下面是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.

 

到第三部分,用一个例子来说明这个类的用法

本文地址:http://com.8s8s.com/it/it4740.htm