하늘소프트SDK API 문서

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