WinForms中有一個事件在拖動窗口時被觸發嗎?WinForms窗口拖動事件
還是有更好的方式做我想做的事:當窗口被拖動時,將窗口不透明度降低到80%?
不幸的是,這是愚蠢的棘手的搜索,因爲每個人都在尋找從殼或其他物體的拖放。
WinForms中有一個事件在拖動窗口時被觸發嗎?WinForms窗口拖動事件
還是有更好的方式做我想做的事:當窗口被拖動時,將窗口不透明度降低到80%?
不幸的是,這是愚蠢的棘手的搜索,因爲每個人都在尋找從殼或其他物體的拖放。
這是你想要的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
,因爲這隻會導致一次(在拖動開始時)設置不透明度,而不是在整個拖動過程中不斷地設置不透明度。
無需黑客的WndProc,這工作得很好:
protected override void OnResizeBegin(EventArgs e) {
this.Opacity = 0.6;
}
protected override void OnResizeEnd(EventArgs e) {
this.Opacity = 1.0;
}
活動也引發了OnResizeXxx事件。
好的發現 - 這是更清潔 – ChrisF 2010-03-31 10:00:58
好的呼籲。它處理得更好。如果你在Win7上做了一些像Aero-shake一樣的操作,然後再重新把窗戶放回去,它會丟失手柄並將窗口保持在不透明狀態,直到你再次移動它。 – 2010-03-31 20:14:51
+1但是,一件壞事是,如果您在應用程序的標題欄處按住鼠標右鍵,它將被視爲「onresizebegin」事件。 – ElektroStudios 2013-05-02 19:47:40
我會嘗試WMEXITSIZEMOVE和WM_ENTERSIZEMOVE,但這肯定是我需要的。謝謝! – 2010-03-30 20:27:50
@Steve - 我的意思是使用WM_ENTERSIZEMOVE而不是LocationChanged。 – ChrisF 2010-03-30 20:32:20
我懷疑這將工作,除非你設置普通形式的不透明度爲99% – 2010-03-30 21:07:22