2014-04-09 3 views
3

MdiParent 컨테이너 내부에서 폼을 다시 열 때마다 자식 폼이 작은 양 (~ 20 픽셀)을 오른쪽 아래로 이동합니다.폼로드시 상위 컨테이너 내에서 로밍 MdiChild 폼을 중지하십시오.

폼로드시 폼에서 폼을 중지하지 않고 부모 내에서 자유롭게 이동하지 못하게 할 수있는 방법이 있습니까?

enter image description here

다음 자식 폼 다시로드 : 여기

은 예입니다

StartPosition = FormStartPosition.Manual 

:

enter image description here

답변

2

변경을 자식 폼에 StartPosition 특성기본값은 WindowsDefaultLocation입니다. 그러면 하위 폼의 각 인스턴스가 매번 오른쪽 아래로 드리프트됩니다. 폼은 폼 MdiChild


Form 클래스 다음의 코드 블록이라고하며, 형태는 처음에 표시되고있다. (나는 어떤 관련이없는 부분을 손질.)

을 다른 모든 StartPosition 값의 Manual 옆에,이 형태의 위치에 대하여에가는 몇 가지 계산하지만 그것은 StartPosition.Manual을 위해 아무것도하지 않는다.

// Adjusts the CreateParams to reflect the window bounds and start position. 
private void FillInCreateParamsStartPosition(CreateParams cp) { 
    switch ((FormStartPosition)formState[FormStateStartPos]) { 
     case FormStartPosition.WindowsDefaultBounds: 
      cp.Width = NativeMethods.CW_USEDEFAULT; 
      cp.Height = NativeMethods.CW_USEDEFAULT; 
      ... 
     case FormStartPosition.WindowsDefaultLocation: 
     case FormStartPosition.CenterParent: 
      ... 
      cp.X = NativeMethods.CW_USEDEFAULT; 
      cp.Y = NativeMethods.CW_USEDEFAULT; 
      break; 
     case FormStartPosition.CenterScreen: 
      if (IsMdiChild) { 
       ... 
       cp.X = Math.Max(clientRect.X,clientRect.X + (clientRect.Width - cp.Width)/2); 
       cp.Y = Math.Max(clientRect.Y,clientRect.Y + (clientRect.Height - cp.Height)/2); 
      } 
      else { 
       ... 
       if (WindowState != FormWindowState.Maximized) { 
        cp.X = Math.Max(screenRect.X,screenRect.X + (screenRect.Width - cp.Width)/2); 
        cp.Y = Math.Max(screenRect.Y,screenRect.Y + (screenRect.Height - cp.Height)/2); 
       } 
      } 
      break; 
    } 
}