0

拖动窗口时是否会触发 WinForms 中的事件?

或者有没有更好的方法来做我想做的事情:当窗口被拖动时,将窗口不透明度降低到 80%?

不幸的是,搜索起来非常棘手,因为每个人都在寻找从 shell 或其他对象中拖放的内容。

4

2 回答 2

3

无需 WndProc 黑客,这工作正常:

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

移动也会触发 OnResizeXxx 事件。

于 2010-03-31T09:52:27.873 回答
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;

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

于 2010-03-30T20:10:41.740 回答