2012-04-04 9 views
0

를 벗어나면 나는 MDI 부모 (Form1에)와 MDI 자식 (Form2를)가 MDI 크기 조정 후 MDI 스크롤 막대를 숨 깁니다. 을 경우 표시되지 않습니다 Form1에의 스크롤 막대 동안C# MDI는 - MDIChild가 경계

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