Windows 용 응용프로그램을 만들 경우에, console 프로그램이 아닌경우에는 실행시에 window의 초기 위치와 크기를 정해주고 싶은 경우가 있을것이다. 나는 몇일전에 있었다~

쉽게 할 수 있는 방법을 정리하고자 한다.

우선 코드를 논하기에 앞서서 내가 사용한 방법을 간략히 설명하자면, MainFrame class에 WM_SHOWWINDOW message에 대한 event handler를 만들어주어 그 안에서 WINDOWPLACEMENT structure를 이용했다.

void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus)
{
    CFrameWnd::OnShowWindow(bShow, nStatus);
    // 창이 보이는 시점이 프로그램 실행 후 최초인지 판별하기 위한 변수
    static bool once = true;  

    // 창이 보이는 시점이 프로그램 실행후 최초인지 검사하는 구문
    if (bShow && !IsWindowVisible() && once) 
    {
       // 프로그램 실행후 이곳은 한번만 실행되도록 once를 false로...
       once = false;

       // 창의 위치에 대한 정보를 담을 변수 min, max
       // min: 창의 좌측 상단의 좌표
       // max: 창의 우측 하단의 좌표
       // 아래에 사용된 숫자는 임의로 사용한 숫자임
       POINT min, max;
       min.x = 100;
       min.y = 100;
       max.x = 500;
       max.y = 500;
  
       WINDOWPLACEMENT lwp;
       lwp.length = sizeof(WINDOWPLACEMENT);
       lwp.flags = SW_SHOWMINIMIZED | WPF_SETMINPOSITION;
       lwp.showCmd = SW_SHOW;
       lwp.ptMinPosition = min;
       lwp.ptMaxPosition = max;
       lwp.rcNormalPosition = CRect(min, max);
       SetWindowPlacement(&lwp);
    }
}


WINDOWPLACEMENT structure에 대한 구체적인 설명은 MSDN을 참고하시기 바라며...
Visual C++ 6.0 MFC에서의 WINDOWPLACEMENT structure documentation (http://msdn2.microsoft.com/en-us/library/aa253040(VS.60).aspx)

추가적으로 창의 최대 크기 및 최소 크기 지정하는 방법까지 설명하겠다...
Window의 최대 크기 및 최소 크기에 대한 정보를 지정하는 방법은 WM_GETMINMAXINFO message에 대한 event handler를 만들어주는 것이다. 아마도 창의 사이즈가 변경될때 OnGetMinMaxInfo를 불러 창 크기의 최대값과 최소값에 대한 정보를 읽어와 동작에 대한 constraint가 주어지는것 같다...
하지만 이것은 내 생각일뿐... 진실은 저 너머에...ㅎㅎㅎ

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)

    // 최소 크기일때 가로폭
    lpMMI->ptMinTrackSize.x = 1000;
    // 최소 크기일때 세로폭
    lpMMI->ptMinTrackSize.y = 700;
    // 최대 크기일때 가로폭
    lpMMI->ptMaxTrackSize.x = GetSystemMetrics(SM_CXSCREEN);
    // 최대 크기일때 세로폭
    lpMMI->ptMaxTrackSize.y = GetSystemMetrics(SM_CYSCREEN);
    CFrameWnd::OnGetMinMaxInfo(lpMMI);
}

GetSystemMetrics(SM_CXSCREEN) 및 GetSystemMetrics(SM_CYSCREEN)은 현재 설정된 해상도의 가로폭과 세로폭에 대한 정보를 return해준다. 이 정보를 사용하면 해상도에 따라 적절한 창의 크기 및 위치를 설정해 줄 수 있다. 또한 나의 경우에는 OnGetMinMaxInfo에서 설정해준 창의 최소 크기의 값을 사용하여 창의 위치를 정해줄때 화면 한가운데에 놓이도록 숫자를 입력하였다. 그러기 위한 숫자들은 수학을 잘하는 당신들이 알아서 해보세요~



Posted by Dansoonie