0

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;
    }
}

一方、 Form1のスクロールバーは、ユーザーがForm2Form1の境界外にドラッグしたときに、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 に答える