[VC++] Window의 초기 크기와 위치 정해주기
Information/Programming :
2008. 2. 24. 21:49
Windows 용 응용프로그램을 만들 경우에, console 프로그램이 아닌경우에는 실행시에 window의 초기 위치와 크기를 정해주고 싶은 경우가 있을것이다. 나는 몇일전에 있었다~
쉽게 할 수 있는 방법을 정리하고자 한다.
우선 코드를 논하기에 앞서서 내가 사용한 방법을 간략히 설명하자면, MainFrame class에 WM_SHOWWINDOW message에 대한 event handler를 만들어주어 그 안에서 WINDOWPLACEMENT structure를 이용했다.
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가 주어지는것 같다...
하지만 이것은 내 생각일뿐... 진실은 저 너머에...ㅎㅎㅎ
GetSystemMetrics(SM_CXSCREEN) 및 GetSystemMetrics(SM_CYSCREEN)은 현재 설정된 해상도의 가로폭과 세로폭에 대한 정보를 return해준다. 이 정보를 사용하면 해상도에 따라 적절한 창의 크기 및 위치를 설정해 줄 수 있다. 또한 나의 경우에는 OnGetMinMaxInfo에서 설정해준 창의 최소 크기의 값을 사용하여 창의 위치를 정해줄때 화면 한가운데에 놓이도록 숫자를 입력하였다. 그러기 위한 숫자들은 수학을 잘하는 당신들이 알아서 해보세요~
쉽게 할 수 있는 방법을 정리하고자 한다.
우선 코드를 논하기에 앞서서 내가 사용한 방법을 간략히 설명하자면, 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);
}
}
{
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);
}
{
// 최소 크기일때 가로폭
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에서 설정해준 창의 최소 크기의 값을 사용하여 창의 위치를 정해줄때 화면 한가운데에 놓이도록 숫자를 입력하였다. 그러기 위한 숫자들은 수학을 잘하는 당신들이 알아서 해보세요~
'Information > Programming' 카테고리의 다른 글
GNU Libtool 사용해서 shared object library 만들어보기 (5) | 2008.10.25 |
---|---|
[S/E] Term confusion - Association and Object Association (4) | 2008.03.23 |
[VC++] Need a more accurate timer? (0) | 2008.03.18 |
[S/E] How is Aggregation and Composition different? (11) | 2008.03.17 |
[Algorithm] 변수 없이 Swap하기, but not an option? (11) | 2008.02.26 |
[C++] in/out parameter passing by reference? And your preference? (0) | 2008.02.21 |
[C++] How to make Circular Dependency work??? (0) | 2008.02.19 |
[VC++ 6.0] Having Trouble with CSpintButtonCtrl??? (0) | 2008.01.31 |
[VC++] Serial Port implementation (How I did it) (4) | 2007.11.26 |
Absurd Compiler Behavior in Visual Studio 6.0 (2) | 2007.10.07 |