본문 바로가기

카테고리 없음

1. 윈도우 프로그래밍의 시작

최호성님의 VISUAL C++ 2008 MFC 윈도우 프로그래밍을 학습한 뒤 정리한 내용입니다.


Visual Studio에서 HelloWorld라는 이름의 Win32 프로젝트 생성한 뒤 만들어진 HelloWorld.cpp 파일에 기초하여 정리된 내용입니다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: 여기에 코드를 입력합니다.
	MSG msg;
	HACCEL hAccelTable;

	// 전역 문자열을 초기화합니다.
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_HELLOWORLD, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// 응용 프로그램 초기화를 수행합니다.
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_HELLOWORLD));

	// 기본 메시지 루프입니다.
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}


위 _tWinMain() 함수는 C언어의 main() 함수처럼 프로그램이 시작될 때 호출됩니다. 이 함수에서 27 ~ 34에 해당하는 while 반복문과 InitInstance(), MyRegisterClass()이 로직의 핵심입니다.


while문에서 GetMessage()가 0을 반환하면 while종료됩니다. 메시지는 메시지 큐에서 가져오며 이 메시지는 이벤트가 발생시 메시지로 변경되어 큐에 저장된 것입니다. 이 모든 작업은 윈도우 운영체제에서 자체적으로 하는 것이며 개발자가 관여하지 않습니다. 응용 프로그램에서 종료하는 메시지는 WM_QUIT이며 이 메시지가 발생시 GetMessage() 함수는 0을 리턴하고 while문의 종료와 함께 프로그램이 종료되게 됩니다. 메시지 큐에서 메시지를 꺼내는 이 반복문을 메인 메시지 루프라고 합니다.


DispatchMessage() 함수는 내부적으로 메시지 프로시저 함수를 호출하여 전달받은 메시지가 무엇인지 분석, 적절한 처리하는 역할을 합니다.


정리

- WinMain() 함수를 통해 윈도우 응용 프로그램이 시작

- 사용자의 입력 이벤트는 모두 메시지로 전환

- 윈도우 운영체제는 이벤트에 따른 메시지를 메시지 큐에 추가

- 메인 메시지 루프는 메시지 큐에서 메시지를 꺼내서(GetMessage()) 처리하는(DispatchMessage()) 핵심코드에 해당

- 윈도우 종료 메시지를 처리하면 메인 메시지 루프가 끝나고 응용 프로그램 종료