2010-03-30 160 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