说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

制作可移动的窗体的MovePanel控件-Delphi资料

HTML文档下载 WORD文档下载 PDF文档下载
制作可移动的窗体的MovePanel控件-Delphi资料

---- 使用Winamp是有个EasyMove的功能,也就是不在标题栏上拖动鼠标就能移动窗体,虽然EasyMove功能很好实现,可还不如做个控件一劳永逸,另外这个控件还有一个更有用的功能,呆会儿就能见到。我们先看看如何实现它吧!

---- 建立一个空的Unit,把以下代码Copy进去,再把它添加到Delphi的控件库里,这样MovePanel控件就做好了。

unit MovePanel;

interface

uses

Windows

Classes

Controls

ExtCtrls;

type

TMovePanel = class(TPanel) //这个控件是继承Tpanel类的

private

PrePoint:TPoint;

Down:Boolean;

{ Private declarations }

protected

{ Protected declarations }

public

constructor Create(AOwner:TComponent);

override;

//重载鼠标事件,抢先处理消息

procedure MouseDown(Button: TMouseButton;

Shift: TShiftState; X

Y: Integer);override;

procedure MouseUp(Button: TMouseButton;

Shift: TShiftState; X

Y: Integer);override;

procedure MouseMove(Shift: TShiftState;

X

Y: Integer);override;

{ Public declarations }

published

{ Published declarations }

end;

procedure Register;

implementation

constructor TMovePanel.Create(AOwner:TComponent);

begin

inherited Create(AOwner); //继承父类的Create方法

end;

procedure TMovePanel.MouseDown(Button:

TMouseButton; Shift: TShiftState; X

Y: Integer);

begin

if (Button=MBLeft) then

begin

Down:=true;

GetCursorPos(PrePoint);

end;

//如果方法已存在,就触发相应事件去调用它,

若不加此语句会造成访存异常

if assigned(OnMouseDown) then

OnMouseDown(self

Button

shift

x

y);

end;

procedure TMovePanel.MouseUp(Button:

TMouseButton; Shift: TShiftState; X

Y: Integer);

begin

if (Button=MBLeft) and Down then

Down:=False;

if assigned(OnMouseUp) then

OnMouseUp(Self

Button

shift

X

y);

end;

procedure TMovePanel.MouseMove(Shift:

TShiftState; X

Y: Integer);

Var

NowPoint:TPoint;

begin

if down then

begin

GetCursorPos(nowPoint);

//self.Parent在Form中就是MovePanel所在的窗体,

或是MovePanel所在的容器像Panel

self.Parent.Left:=self.Parent.left

+NowPoint.x-PrePoint.x;

self.parent.Top:=self.Parent.Top

+NowPoint.y-PrePoint.y;

PrePoint:=NowPoint;

end;

if Assigned(OnMouseMove) then

OnMouseMove(self

Shift

X

y);

end;

procedure Register;

begin

RegisterComponents('Md3'

[TMovePanel]);

end;

end.

---- 接下来,看看怎么用它吧。

---- 用法一:拖一个Form下来,加上我们的MovePanel,Align属性设为alClient,运行一下,移动窗体的效果还不错吧!想取消此功能,把MovePanel的Enabled属性设为False即可,简单吧!

---- 用法二:拖一个Form下来,加上普通的Panel,调整好大小,再在Panel上加上我们的MovePanel

Align属性设为alClient,运行一下,这一次在我们拖动MovePanel时不是窗体在移动,而是Panel和MovePanel一起在窗体上移动,如果我们再把其他的控件放在MovePanel上,就成了可以在窗体上任意移动的控件了,就这么简单!

备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘