2009-05-31 78 views
4

当窗体STOPS被移动时,C#中是否有任何事件触发。不动它的时候。C#窗体移动停止事件

如果没有事件发生,有没有办法用WndProc来做?

回答

12

移动结束后触发ResizeEnd事件。也许你可以使用它。

+0

我对此一无所知。刚刚检查,它的工作原理!谢谢 – 2009-05-31 21:26:29

+0

+1 - 我显然花了太多的时间做网络应用程序。 – 2009-05-31 21:28:28

+0

哈哈,不错。非常感谢。 – Ozzy 2009-05-31 21:40:02

0

只要在触发移动事件时将标志设置为true即可。如果mouseup事件发生并且该标志为true,则表单停止移动。

我承认这在用户通过键盘移动窗体的情况下可能不起作用,但这很少见。

+1

MouseUp事件是不太可能被解雇因为移动表单通常是使用标题栏完成的,并且鼠标事件不会引发该区域中的鼠标操作。 – 2009-05-31 20:51:59

+0

如果您从标题栏部分移动窗体,mouseup事件不会触发 – Ozzy 2009-05-31 20:54:18

2

这不是一个故障安全的解决方案,但它是纯粹的.NET,它很简单。将一个计时器添加到您的表单中,将其设置为相对较短的延迟(对我而言,100-150 ms似乎不错)。添加以下代码为Form.LocationChanged和Timer.Tick事件:

private void Form_LocationChanged(object sender, EventArgs e) 
{ 
    if (this.Text != "Moving") 
    { 
     this.Text = "Moving"; 
    } 
    tmrStoppedMoving.Start(); 
} 

private void Timer_Tick(object sender, EventArgs e) 
{ 
    tmrStoppedMoving.Start(); 
    this.Text = "Stopped"; 
} 

如果您想了解更多详细的处理(什么时候了鼠标按键时释放的标题栏,这样知道),你可能会需要潜水进入监控windows消息。

+0

对于任何想要了解此答案的最后部分(确定何时在移动过程中按下并释放鼠标时)的更多信息,请查看我的问题,进一步深入研究http://stackoverflow.com/questions/24493167/wm-nclbuttonup-message-not-sent-at-the-end-of-dragging-a-form-how-to-do -so – AnotherUser 2014-06-30 16:18:02

0

我对用户控件有同样的问题,但它没有ResizeEnd事件。解决方案的工作是覆盖WndProc方法并侦听EXITSIZEMOVE。

见例如here

0

我测试ResizeChanged事件,并能正常工作,但我不知道移动和调整之间的关系,但它为我工作