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