说实话,我不明白你为什么要这样做,我先按照你的要求给你做一个,
过会再说类似的一个程序。
实现你要求的功能:
先继承TCustomPanel,生成一个你自己的Panel控件。
type
TMyPanel = class(TCustomPanel)
private
{ Private declarations }
OldLeft, OldTop: Integer;
procedure WMNCHitTest(var Message: TMessage);
message WM_NCHITTEST;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent);
override;
published
{ Published declarations }
end;
也就是说,添加了两个属性,OldLeft, OldTop。
并且在Create中,将其设置为0(或者是另外的你认为永远不可以出现的值,因为0可能会出现)。
constructor TMyPanel.Create(AOwner: TComponent);
begin
inherited;
OldTop := 0;
OldLeft := 0;
end;
然后,WMNCHITTEST方法,如下。
procedure TMyPanel.WMNCHitTest(var Message: TMessage);
begin
if (csDesigning in ComponentState) then
// 如果不是在运行的时候,在设计的时候
begin
// 不要做任何处理,调用缺省的处理过程
DefaultHandler(Message);
Exit;
end;
if (OldLeft = 0) or (OldTop = 0) then
//如果是0,如果在Create为其设置其它你认为
begin
// 不可能出现的值,则将这里修改掉你认为的值
OldLeft := Left;
// 表示如果OldLeft或OldTop还没有赋过值
OldTop := Top;
// 为其赋初值后,不做任何处理,退出。
Exit;
end;
Message.Result := HTCAPTION;
// 这句话是关键,这样,使得任何在Panel上先左键,然后,按住,移动
// 都会拖动这个Panel
if (Left <> OldLeft) or (Top <> Top) then
// 如果发现Left或Top值发生了变化,表示拖动发生
begin
Parent.Left := Parent.Left + Left - OldLeft;
// 计算其Parent窗体新的Left及Top,假设其Parent为你想要移的窗体
// 最好你设置一个属性,表示你要移哪个对象。
Parent.Top := Parent.Top + Top - OldTop;
Left := OldLeft;
// 再将自己的相对位置设置回来。保持自己与窗体的相对位置
Top := OldTop;
end;
end;
然后,将这个Panel直接放在窗体上,拖动Panel,就会移动窗体了。
但是,实际上我猜测你是想隐掉Caption栏,或者说,点击Form的Client区,就可以移动窗体。
如果真是如此的话,做法更简单,
在窗体中添加这里的
procedure WMNCHitTest(var Message: TMessage);
message WM_NCHITTEST;
这行定义放在Private区中。
然后,在其实现函数中只要一句话:
Message.Result := HT_CAPTION。
添加这句话的结果就是,无论你拖窗体的哪里,都是在移窗体,可能这也不是你想要的。
不过,你可以根据Mouse所在的区域来决定是否这样做等等,这就是你具体要实现什么功能
而定了,我这里无从猜测起。
祝你好运。。。