【问题标题】:C# MDI - Hide MDI Scrollbars after MDI resize when MDIChild is out of boundsC# MDI - 当 MDIChild 超出范围时,在 MDI 调整大小后隐藏 MDI 滚动条
【发布时间】:2012-04-18 18:36:20
【问题描述】:

我有一个 MDI 父级 (Form1) 和一个 MDI 子级 (Form2)。当 Form2 通过在 Form2 中放置以下代码超出 Form1 的边界时,我目前禁用了 Form1 的滚动条:

protected override void WndProc(ref Message m)
{
    const int WM_MOVE = 0x0003;

    switch (m.Msg)
    {
        case WM_MOVE:
            return;

        default:
            base.WndProc(ref m);
            break;
    }
}

当用户将 Form2 拖出 Form1 时,如果 Form2 超出范围,Form1 的滚动条将不会显示 的界限。但是,如果用户 resize Form1Form2 超出范围,它将显示滚动条。

我怎样才能解决它,以免发生这种情况

【问题讨论】:

  • WM_SIZE 报告了这一点。这是一个非常糟糕的主意。至少移动子窗口而不是吞下消息。

标签: c# scrollbar mdi wndproc mdiparent


【解决方案1】:

我现在为自己找到了一个可行的解决方案。在 MDI 表单 (Form1) 上。我使用以下代码。它至少有助于摆脱闪烁。

    [System.Runtime.InteropServices.DllImport("user32.dll")]

    private static extern int ShowScrollBar(IntPtr hWnd, int wBar, int bShow);

    protected override void WndProc(ref Message m)
    {
        const int WM_MOVE = 0x0003;
        const int WM_ENTERSIZEMOVE = 0x0231;
        const int WM_EXITSIZEMOVE = 0x0232;
        const int SB_BOTH = 3;

        switch (m.Msg)
        {
            // Use SuspendLayout() instead of having constant flickering on resize starting
            case WM_ENTERSIZEMOVE:
                this.SuspendLayout();
                base.WndProc(ref m);
                break;

            // Do not forget to ResumeLayout() when resizing finished
            case WM_EXITSIZEMOVE:
                this.ResumeLayout();
                base.WndProc(ref m);
                break;

            default:
                ShowScrollBar(this.Handle, SB_BOTH, 0);
                base.WndProc(ref m);
                break;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多