我在WM_MOVE
上调用了以下代码procedure TForm15.WMMove(var Message: TMessage);
begin
if( (((TWMMove(Message).XPos + Self.Width >= Form14.Left) and (TWMMove(Message).XPos <= Form14.Left)) or
((TWMMove(Message).XPos <= Form14.Left + Form14.Width) and (TWMMove(Message).XPos >= Form14.Left))) and
(((TWMMove(Message).YPos + Self.Height >= Form14.Top) and (TWMMove(Message).YPos <= Form14.Top)) or
((TWMMove(Message).YPos <= Form14.Top + Form14.Height) and (TWMMove(Message).YPos >= Form14.Top))))
then begin
Self.DragKind := dkDock;
end else Self.DragKind := dkDrag;
end;
这可能是你在生活中看到的最丑陋的陈述,但这不是问题。 :)
如果当前表单(Self)位于mainForm(Form14)中的某个位置,则应该更改DragKind。
但是,当它将DragKind设置为dkDock时,它不会使currentForm(Self)停靠,除非用户停止移动表单并再次开始移动它,所以我尝试执行以下操作:
如果上述语句的结果为非零且设置了dkDock,则将以下消息发送到表单:
WM_EXITSIZEMOVE //停止移动表单
WM_ENTERSIZEMOVE //再次开始动作
但是,我不知道该怎么做:
SendMessage(Self.Handle,WM_EXITSIZEMOVE,?,?);
我尝试使用随机参数(1,1),但没有效果。也许这不是正确的方法?
答案 0 :(得分:2)
看起来这两条消息是通知 - 直接发送它们可能没有做任何事情。正如雷蒙德·陈(Raymond Chen)曾经说过的那样(可怕地转述),直接发送这些信息并期待采取行动就像试图通过在仪表中移动针来重新填充油箱。
WM_SIZING和WM_MOVING是可用于监视用户更改窗口大小和位置以及阻止进一步更改的消息。
来自MSDN:
lParam的
指向RECT结构的指针 与当前的位置 窗口,在屏幕坐标。至 改变拖动的位置 矩形,应用程序必须更改 这个结构的成员。
因此,您可以更改成员以强制窗口保持在一个位置。
答案 1 :(得分:1)
这是一条通知消息,导致表单停止移动 并且两个参数都被忽略(未使用)。