昨天在楼梯来了个倒栽葱!全为这个问题!!如何使得点击form任一部分都可以拖动窗口??(30分)

  • 主题发起人 主题发起人 nuke
  • 开始时间 开始时间
N

nuke

Unregistered / Unconfirmed
GUEST, unregistred user!
哎!!!
昨天那个惨哪!!!甭提!!!
迷迷糊糊脑子全都是 begin
.....end.
....form.caption........
下楼梯时突然不知该迈哪只脚,于是.......
@##@!$#@$$
现在肘上还有一块巴掌大的伤口!
/(```~-~````)/
哎!
只好来求救各位位了!!

注意!不是普通的把单击窗口的message转化倒单击caption的message
上就可以的。
因为本人的form borderstyle 是 alnone;

 
你是否也在学“法*功”了吧!可别走便哦?(玩笑!)
你的"点击form任一部分都可以拖动窗口",那对于Form正常的操作将如何进行呢?
拖动Form问题不是很大,Windows、word是在Form边框处移动Form.你别出心裁的
想法到是好的,但不能因此影响Form的正常操作!
可别被“法*功”弄昏了头脑?
 
type
TForm1 = class(TForm)
private
{ Private declarations }
public
procedure WMNCHitTest(var M: TWMNCHitTest);
message WM_NCHITTEST;
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
{If the client has been clicked, make Windows believe}
{it was the caption bar that was clicked on}
if M.Result = htClient then
M.Result := htCaption;
end;
 
一般是有两个方法:
1。响应Form的MouseDown:
begin
Remember current mouse position;
Set a flag;
SetCapture();
// Capture mouse events
end;
响应Form的MouseMove:
begin
if (flag is set) then

begin
Move Form to new position;
end;
end;
响应Form的MouseUp:
begin
ReleaseCapture();
Clear the flag;
end;
2. 响应Form的WM_NCHITTEST消息,返回HTCAPTION
 
还有一种方法:
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
ReleaseCapture;
SendMessage(Handle, WM_SYSCOMMAND, 61458, 0);
end;
 
WMNCHitTest的方法是我原来用的,没效果。
我的form的borderstyle是alnone哦!
redforks的第二种方法我也试过,依然没用哦!
我的程序是一个borderstyle为alnone的form上有一个image
,把borderstyle去掉是为了只显示image作为界面。
我想通过在image上鼠标的拖拉使得窗体可以移动,简单一点的
说就象winamp那样
 
查一下以前的帖子吧,这个问题我回答了N次,也因此骗了N多的分数了, 都拿的不好意思了。
 
算了再贴一次吧
来自:menxin 时间:99-5-16 08:59:35 ID:108565
//只需在mousedown时向form发出move消息即可。
procedure TForm1.Panel1MouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
if Button <> mbRight then
begin

ReleaseCapture;
Form1.Perform(WM_SysCommand, $f017, 0);
end;
end;


来自:DNChen 时间:99-5-16 11:35:40 ID:108589
menxin的方法是最好的,我已经多次用这个方法了,
可以支持拖动所有的twincontrol,所以也可以
拖动button等等
Form1.Perform(WM_SysCommand, $f017, 0);
红色部分是指所要拖动的对象,可以随意修改。
所以也就可以实现按在一个按钮上拖动一个窗体等等效果了。


 
呵呵!
刚才才自己解决了。
也怪!
好几次了,来大富翁提问前总是搞不出来。
一提问没多久就能自己搞出来。呵呵!
没想到大富翁还有激发人灵感的妙处哦!
不过Menxin的方法的确比较好。我虽然自己完成了,可也写了七八行代码。
menxin一行就能解决。恩!不错不错。
哦???Menxin没来??呵呵!那就算在dnchen上喽。
大家分赃!!!
 
to nuke
能否把你的方法拿出来让大家共同分享呢?!
 
奇怪,我把BorderStyle := bsNone,没有找到alNone,
放上一个Align := alClient的Image,并找了一个大JPEG覆盖了整个Image,
用WMNCHitTest没有出现问题啊?
我的第二种方法由于Mouse消息传递不下去,用Image的MouseDown事件就好了。
Send $f017和61458都可以拖动,不知道这两个消息有什么不同?
 
说我呢,nuke,你确实过奖,我也是在这里才学了很多.
 
呵呵!
我的方法是最笨的
嘻嘻
用clienttodscreen算出lefttop然后再>>>form
嘻嘻!
 
多人接受答案了。
 
后退
顶部