0

我有一个 MDI Parent ( Form1 ) 和一个 MDI Child ( Form2 )。当Form2超出 Form1 的边界,我目前已禁用 Form1 的滚动条,方法是Form2 中放置以下代码:

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的范围时, Form1的滚动条将不会显示Form2是否超出范围。但是,如果用户将Form1的大小调整Form2超出范围的位置,它将显示滚动条。

我该如何解决它,以免发生这种情况

4

1 回答 1

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;
        }
    }
于 2012-04-05T13:18:47.367 回答