【发布时间】:2010-03-31 17:52:27
【问题描述】:
WinForms 中是否存在在拖动窗口时触发的事件?
或者有没有更好的方法来做我想做的事:在拖动窗口时将窗口不透明度降低到 80%?
不幸的是,搜索起来非常棘手,因为每个人都在寻找从 shell 或其他对象中拖放的内容。
【问题讨论】:
标签: winforms events opacity drag
WinForms 中是否存在在拖动窗口时触发的事件?
或者有没有更好的方法来做我想做的事:在拖动窗口时将窗口不透明度降低到 80%?
不幸的是,搜索起来非常棘手,因为每个人都在寻找从 shell 或其他对象中拖放的内容。
【问题讨论】:
标签: winforms events opacity drag
不需要 WndProc 黑客,这工作正常:
protected override void OnResizeBegin(EventArgs e) {
this.Opacity = 0.6;
}
protected override void OnResizeEnd(EventArgs e) {
this.Opacity = 1.0;
}
移动也会触发 OnResizeXxx 事件。
【讨论】:
这是您想要的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;
处理WM_ENTERSIZEMOVE(代码0x0231)消息而不是LocationChanged 可能更有效,因为这只会导致设置不透明度一次(在拖动开始时),而不是在整个拖动过程中持续设置.
【讨论】:
Opacity 是1.0。我已经让这两个版本的代码在一个应用程序中运行,没有任何问题。