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