Win32 샘플 6 - 다중 윈도우
이 샘플은 다중 뷰 없이 다중 윈도우만을 구현하는 예제를 설명하도록 한다. 구현 형태가 살짝 다르기는 하지만 앞의 다중 윈도우/다중 뷰와 비교할 때 더 간단한 예제이므로 이해하는 데 큰 어려움이 없을 것이다.
먼저 동작 화면은 다음과 같다.
보관된 원본 이미지가 없어 표시할 수 없습니다. 위 코드와 설명을 참고해 주십시오.
win32_sample06_01.png[그림 6-1] 다중 윈도우 어플리케이션의 새 창 열기 메뉴
보관된 원본 이미지가 없어 표시할 수 없습니다. 위 코드와 설명을 참고해 주십시오.
win32_sample06_02.png[그림 6-2] 새 창 열기의 결과로 생성된 윈도우
윈도우 맵
다중 윈도우 맵을 관리하기 위한 map을 아래와 같이 선언한다. 윈도우 핸들을 키로, CWndMapView 클래스의 인스턴스를 밸류로 가진다.
map<HWND,CWndMapView> g_mapMapview;
새 창 추가
메뉴의 커맨드를 처리하는 WM_COMMAND 메시지의 이벤트 핸들러에 해당되는 onCommand()에서 IDM_NEW_WINDOW 처리부에서 새 창을 다음과 같이 생성한다.
LRESULT onCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
// 메뉴의 선택 영역을 구문 분석합니다.
switch (wmId) {
...
case IDM_NEW_WINDOW :
{
HWND hWnd = CreateWindow(
g_szWindowClass,
g_szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
g_hInstance,
NULL
);
ShowWindow(hWnd, SW_NORMAL );
UpdateWindow(hWnd);
}
break;
...
}
return 0;
}
창이 생성될 때의 처리
CreateWindow()에 의해 창이 생성될 때 WM_CREATE 메시지가 전달되는데 onCreate()에서 다음과 같이 새로운 창의 윈도우 핸들로 윈도우 맵의 아이템을 추가하고 그 아래에서 hencCreate()를 사용하여 새로 생성된 창에 대한 HGLRC를 생성한다.
LRESULT onCreate(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
TCHAR buf[256];
LPCREATESTRUCT cs = (LPCREATESTRUCT )lParam;
g_cntWindow++;
CWndInfo &info = g_wndInfo[ hWnd ];
info.m_hwnd = hWnd;
info.m_cntView = CNT_INITIAL_VIEW;
_stprintf_s( buf, 256, _T( "HNS ENC 0x%X" ), hWnd );
SetWindowText( hWnd, buf );
HDC hdc = GetDC( hWnd );
hencCreate( hWnd );
...
}
생성된 창의 제거
창을 닫을 때 WM_DESTROY 메시지가 전달되는 데 hencDelete() 함수를 사용하여 창과 연결된 HGLRC를 삭제하며 생성된 창의 개수 값이 0일 때는 PostQuitMessage() 함수를 실행하여 인스턴스를 종료한다.
LRESULT onDestory(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
hencDelete( hWnd );
if( --g_cntWindow <= 0 )
PostQuitMessage(0);
return 0;
}
WinMain.cpp