【问题标题】:How to detect when an MDIClient window has been scrolled如何检测 MDIClient 窗口何时滚动
【发布时间】:2013-12-02 20:37:31
【问题描述】:

当用户通过拖动 MDIClient 的滚动条拇指滚动它时,我需要更新 System.Windows.Forms.MDIClient 容器中子窗口的位置。

但是,我找不到在发生这种情况时触发的事件。

我只是想念它,还是需要解决方法,可能直接与滚动条对话?

我已经尝试过处理 MDIClient.Layout 事件,但它们没有被滚动触发。

编辑:我实际上只需要知道滚动何时停止,以便更改我的子窗口的位置。

EDIT2:作为一种临时解决方法,我每秒都在计时器上重置子窗口位置,显然不理想,但总比没有好。不过看起来很糟糕!

【问题讨论】:

  • 在这里检测滚动你到底想要什么?我的意思是您可以通过拖动拇指进行滚动,也可以通过滚动鼠标进行滚动。
  • 真正的任何滚动,无论它是如何完成的 - 问题是我的子控件需要始终位于 MDIClient 容器的右下角,并且滚动容器会将控件从我不知道的那个角落。如果我更改 MDIClient 的父窗口(顶级窗口)的大小,那很好,因为我检测到(使用父级的 Layout 事件),但我从 MDIClient Layout 事件中什么也得不到。

标签: c# winforms events


【解决方案1】:

虽然有点尴尬,但这是可能的。 Winforms 不能很容易地找到 MdiClient 窗口,并且该类本身不会公开 Scroll 事件。这可以解决,就像在 Winforms 中一样,您必须对父窗口的本机 MDI 客户端窗口进行子类化,以便捕获 WM_VSCROLL 消息。此代码运行良好,将其粘贴到您的父表单类中:

void MdiClient_Scroll(object sender, ScrollEventArgs e) {
    if (e.Type == ScrollEventType.EndScroll) {
        // Do your stuff
        //...
    }
}

private MdiClientWrapper wrapper;

protected override void OnHandleCreated(EventArgs e) {
    // Find the MdiClient and sub-class it so we can get the Scroll event
    base.OnHandleCreated(e);
    if (wrapper != null) wrapper.Scroll -= MdiClient_Scroll;
    var client = this.Controls.OfType<MdiClient>().First();
    wrapper = new MdiClientWrapper();
    wrapper.AssignHandle(client.Handle);
    wrapper.Scroll += MdiClient_Scroll;
}

private class MdiClientWrapper : NativeWindow {
    public event ScrollEventHandler Scroll;
    private int oldPos;
    protected override void WndProc(ref Message m) {
        if (m.Msg == 0x115) {   // Trap WM_VSCROLL
            var type = (ScrollEventType)(m.WParam.ToInt32() & 0xffff);
            var pos = m.WParam.ToInt32() >> 16;
            Scroll(this, new ScrollEventArgs(type, oldPos, pos));
            oldPos = pos;
        }
        base.WndProc(ref m);
    }
}

【讨论】:

  • 效果很好,正如他们所说的开箱即用(我也添加了水平滚动测试)。再次感谢。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多