万卷书>>电脑书籍>>程序设计>>DELPHI相关>>DELPHI专题文档>>控件应用

WANJUANSHU.COM

制作可移动的窗体的MovePanel控件

福州大学
王骏

---- 使用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上,就成了可以在窗体上任意移动的控件了,就这么简单!

 
上一页 WanJuanShu.COM  
WANJUANSHU.COM 万卷书