打印本文 打印本文 关闭窗口 关闭窗口
控件移动类的实现之一
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2070  更新时间:2009/4/23 18:30:39  文章录入:mintao  责任编辑:mintao

Delphi的IDE是本身就是一个非常精彩的软件,其中涵含了许多非常宝贵的软件知识。IDE中有一个窗体设计器,控件放在里面,就可以随意移动,以及调整大小,如果能够自己实现一个类似于这样的窗体设计器,那真是一件非常美妙事情。本文实现的就是窗体设计器中最重要的部分,一个移动控件的类,控件要求从TControl继承下来,在介绍如何实现之前,先说说这个类的用法:

 

其中有两个类:

TDragClass就是实现拉动的类

TDragPoint是控件周围出现的拉动点的类

用法很简单:

创建一个TDragClass对象

将要实现拉动的控件传进去就行了

比如:

myDrag.addControl(Edit1);

这样Edit1就能实现拉动和移动了。

另外有两个属性来控制移动的方式

isMoveStep:boolean

指定移动的方式,True为跳跃式,False为连续式,默认情况下是False,即连续式。

所谓跳跃式,即移动或拉动控件时,控件是以离散的方式在改变自己的位置和大小的,这个对窗体设计器中的控件对齐有帮助。而连续式,当然就是以连续的方式使控件的位置和大小得到改变。

MoveStep :integer

当移动方式为跳跃式时,该属性指定跳跃的大小,范围在5-20之间

另外还有一个方法:SetPointVisible(value:Boolean);用于指定移动点的可见性。在Delphi中,当你点击窗口时,控件周围的八个小点就消失了,即用此原理。

 

现在开始进入到具体实现的部分了,当你点击Delphi的窗体设计器中的控件时,控件周围出现了八个小点,这八个小点其实也是窗口类:TGrabHandle。预想中要实现控件移动,得有一个标识你正在移动或拉动的东西,这八个小点正是,Delphi的这种做法可以借鉴。于是我实现了一个移动点类:TDragPoint,该的对象将作为TDragClass的成员之一,具体等一下再讲。现在来看它的实现,其实非常简单,因为VCL给了我们一个有自绘能力的类TCustomControl,只要从这里继承下来,再重载其中的Paint方法,自己来画这个移动点就行了。

代码非常简单,这里就不多说了:

//---------TDragPoint--------------------------

unit UDragPoint;

 

interface

    uses Windows, Messages,Controls,Classes,Graphics;

type

  TDragPoint=class(TCustomControl)

  protected

    procedure Paint;override;

  public

    //处理移动时用变量

    isDown:Boolean;

    PrevP,NextP:TPoint;

    constructor Create(AOwner: TComponent); override;

    procedure CreateWnd; override;

  published

    property OnMouseMove;

    property OnMouseDown;

    property OnMouseUp;

  end;

 

implementation

 

{ TDragPoint }

 

constructor TDragPoint.create;

begin

  inherited Create(AOwner);

  isDown:=False;

  Width:=6;

  Height:=6;

end;

 

procedure TDragPoint.CreateWnd;

begin

  inherited;

    //使该类位窗口最前

    BringWindowToTop(self.Handle);

end;

 

procedure TDragPoint.Paint;

begin

  Canvas.Brush.Color:=clBlack;

  Canvas.Brush.Style:=bsSolid;

  Canvas.Rectangle(0,0,width,Height);

end;

 

end.

 

这里有必须谈到的一点是该类重载了WndCreate,并在其中写入BringWindowToTop(self.Handle);这样做目的是让这些移动点控件能够位于窗口的最前位置。另外在其中显化了三个鼠标事件:

property OnMouseMove;

    property OnMouseDown;

    property OnMouseUp;

目的是为了在TDragClass中实现移动这些点。

 

现在可以进入主题,来说明TDragClass的实现了。

其中有一个保存传进来的控件的列表类:FConList:TList;还有一个标识当前正在被移动或拉动的控件在FConList中的索引FCurActiveCon:Integer;

还有控件事件相关的成员

      FConMouseDown:TMouseEvent;

[1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口