WinForms窗口拖动事件

时间:2010-03-30 20:07:40

标签: winforms events opacity drag

WinForms中是否有一个事件在拖动窗口时被触发?

或者有更好的方法可以做我想要的事情:在拖动窗口时将窗口不透明度降低到80%?

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

2 个答案:

答案 0 :(得分:3)

不需要WndProc黑客,这很好用:

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

移动也会触发OnResizeXxx事件。

答案 1 :(得分: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可能更有效,因为这只会导致设置不透明度一次(在拖动开始时)而不是在整个拖累过程中不断。