一个小问题,非常简单,请帮忙!(30分)

  • 主题发起人 主题发起人 嫩手
  • 开始时间 开始时间

嫩手

Unregistered / Unconfirmed
GUEST, unregistred user!
在窗体上放一个Panel,在Panel的onMouseMove事件中怎么写才能让窗体也跟着动?
ReleaseCapture;
Perform(WM_SYSCOMMAND,$F012,0);
就是,用鼠标抓着Panel移动,动的是窗体?
我9:30之前在线等待!
 
到http://www.tommstudio.com/newclub30/ 的技巧中找找看有没有这方面的文章。
 
太多了,能不能给写出来?
 
说实话,我不明白你为什么要这样做,我先按照你的要求给你做一个,
过会再说类似的一个程序。
实现你要求的功能:
先继承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所在的区域来决定是否这样做等等,这就是你具体要实现什么功能
而定了,我这里无从猜测起。
祝你好运。。。
 
对不起,也许我没说清,我用了一个第三方控件,想把这个控件做成窗体,意思是窗体的
borderstyle 设为bsnone,autosize为true,这样,窗体上只有这个控件了,我想用鼠标
拖动这个控件时,窗体也跟着动,这回清楚了吗?上面的总是报错,还有其它办法吗?
谢谢!
 
首先,上面的代码不会报错的,呵呵,虽然我没有花太多的时候,但我是实际测试过的。
Delphi6环境下通过。
另外,你想做成你想要的效果,这一点却有点难了。。。就不是你所说的简单的问题了。
自己写OnMouseDown,OnMouseMove及OnMouseUp或许是一个比较简单的选择。
在OnMouseDown的时候,记录下Mouse的位置,并使状态进入一个可以拖动的状态。
在OnMouseMove的时候,比较两次位置,然后,改变Parent(即窗体)的Left及Top。
在OnMouseUp的时候,取消拖动状态设置,即再移动Mouse的时候,窗体不会移动。
其实,这样做是个不错的选择,试试看吧。
 
formail4.2顶端有个小提示条,也是这样做的吧
 
应该是。。。但我并不确定。
 
好了,谢谢你,我已经解决了
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部