2010-03-30 100 views
0

WinForms中有一个事件在拖动窗口时被触发吗?WinForms窗口拖动事件

还是有更好的方式做我想做的事:当窗口被拖动时,将窗口不透明度降低到80%?

不幸的是,这是愚蠢的棘手的搜索,因为每个人都在寻找从壳或其他物体的拖放。

回答

2

这是你想要的LocationChanged事件:

private void YourApp_LocationChanged(object sender, EventArgs e) 
{ 
    this.Opacity = 0.8; 
} 

你必须重写WndProc和处理退出移动事件的不透明度重置回1:

protected override void WndProc(ref Message m) 
{ 
    Trace.WriteLine(m.ToString()); 
    switch (m.Msg) 
    { 
     case WMEXITSIZEMOVE: 
      this.Opacity = 1.0; 
      break; 
    } 
    base.WndProc(ref m); 
} 

不要忘记定义消息代码:

private const int WMEXITSIZEMOVE = 0x0232; 

可能是mo重新有效地处理WM_ENTERSIZEMOVE(代码0x0231)消息而不是LocationChanged,因为这只会导致一次(在拖动开始时)设置不透明度,而不是在整个拖动过程中不断地设置不透明度。

+0

我会尝试WMEXITSIZEMOVE和WM_ENTERSIZEMOVE,但这肯定是我需要的。谢谢! – 2010-03-30 20:27:50

+0

@Steve - 我的意思是使用WM_ENTERSIZEMOVE而不是LocationChanged。 – ChrisF 2010-03-30 20:32:20

+0

我怀疑这将工作,除非你设置普通形式的不透明度为99% – 2010-03-30 21:07:22

3

无需黑客的WndProc,这工作得很好:

protected override void OnResizeBegin(EventArgs e) { 
    this.Opacity = 0.6; 
} 
protected override void OnResizeEnd(EventArgs e) { 
    this.Opacity = 1.0; 
} 

活动也引发了OnResizeXxx事件。

+0

好的发现 - 这是更清洁 – ChrisF 2010-03-31 10:00:58

+0

好的呼吁。它处理得更好。如果你在Win7上做了一些像Aero-shake一样的操作,然后再重新把窗户放回去,它会丢失手柄并将窗口保持在不透明状态,直到你再次移动它。 – 2010-03-31 20:14:51

+0

+1但是,一件坏事是,如果您在应用程序的标题栏处按住鼠标右键,它将被视为“onresizebegin”事件。 – ElektroStudios 2013-05-02 19:47:40