최호성님의 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()) 핵심코드에 해당
- 윈도우 종료 메시지를 처리하면 메인 메시지 루프가 끝나고 응용 프로그램 종료