2012-04-04 9 views
0

外である場合にリサイズMDI後MDIスクロールバーを隠します。 場合Form1のためのスクロールバーが表示されませんがC#MDI - のMDIChild私はMDI親(<strong>をForm1</strong>)とMDI子(<strong>フォーム2</strong>)を有する境界

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はForm2の内に以下のコードを配置することによって、をForm1の境界を越えて行くとき、私はForm1のため現在無効になってスクロールバーを持っていますForm2は、ユーザがをドラッグすると境界外に出る。Form2から外れるForm1の範囲。しかし、ユーザがサイズ変更する場合、スクロールバーが表示されますフォーム1ここからフォーム2が外れます。これは私が今の自分のために作業可能な解決策を見つけた

+0

WM_SIZEはそれを報告します。これは本当に悪い考えです。少なくともメッセージを飲み込むのではなく、子ウィンドウを移動する。 –

答えて

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; 
     } 
    } 
関連する問題