[VC++] Window의 초기 크기와 위치 정해주기

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에서 설정해준 창의 최소 크기의 값을 사용하여 창의 위치를 정해줄때 화면 한가운데에 놓이도록 숫자를 입력하였다. 그러기 위한 숫자들은 수학을 잘하는 당신들이 알아서 해보세요~