목표
WinMain함수에서 전달한 메세지를 처리하는 윈도우 프로시저(WinProc 함수)에 대해서 알아보도록 하겠습니다.
개요
지난 포스팅에서 WinMain에 대한 내용에 대해서 이해하는 시간을 가졌습니다. 사용자의 이벤트로부터 발생되는 메세지를 메세지 큐를 통해 받아서 메세지 처리 전용 함수인 윈도우 프로시저로 전달한다고 했습니다. 윈도우 프로시저는 메세지를 받아서 어떻게 처리하는지에 대해서 알아보도록 하겠습니다.
윈도우 프로시저(Window Procedure, WndProc 함수)
WinMain 함수에서 메세지 루프를 통해서 발생한 메세지를 큐에 저장합니다. 해당 메세지를 처리하기 위해서 메세지 처리 전용 함수로 전달되어야 합니다. 이 때, 메세지 처리 전용 함수는 윈도우 프로시저입니다. 윈도우 프로시저는 WinMain 함수와는 별도로 WndProc 함수의 형태로 존재합니다. 이 윈도우 프로시저는 다음과 같은 특징을 갖습니다.
윈도우 프로시저의 특징
1. WinMain에서 호출하는 것이 아닌, 윈도우에 의해서 호출된다.
2. WinMain내에 존재하는 메세지 루프는 메세지 처리 전용 함수로 전달하는 역할만 한다.
3. 윈도우 프로시저는 메세지가 들어오면 호출되며, 메세지에 맞게 내용을 처리한다.
4. 콜백 함수(CallBack Function)이다.
위 특징을 보시면, WinMain 함수는 발생한 메세지를 전달하는 역할만 하는 것을 알 수 있습니다. 메세지 처리는 일절 관여하지 않습니다. 메세지를 전달하는 역할을 하기 때문에, 윈도우 프로시저를 WinMain이 호출하는 것이라고 오해할 수 있지만, 사실 윈도우가 호출해야합니다.
이를 콜백 함수(CallBack Function)이라고 합니다.
*콜백 함수(CallBack Function) : 사용자가 호출하는 것이 아닌, 운영체제에 의해 호출되는 함수
Win32 API에서 윈도우 프로시저는 WndProc() 함수를 통해 제공하고 있습니다. 코드 원문은 다음과 같습니다.
보시는 것과 같이, 반환형은 LRESULT인 CallBack 함수로 4개의 인수를 갖고 있는 것을 확인할 수 있습니다.
LRESULT에 대한 내용은 다음 링크에서 확인할 수 있습니다. → [Windows API] 윈도우 프로젝트 생성과 WIN32 API의 기본 구조-(1)
먼저, 각각의 인수는 어떤 내용을 담고 있는지 확인해보도록 하겠습니다.
WndProc 함수의 인수
HWND hWnd : 메세지를 받을 윈도우의 핸들
UINT iMessage : 어떤 메세지를 받았는지?
WPARAM wParam : 메세지에 따른 부가 정보
LPARAM lParam : 메세지에 따른 부가 정보
어떤 윈도우에서 처리해야 할 메세지인지, 어떤 메세지를 처리해야 하는지, 메세지에 따른 부가정보에 대한 내용을 담고 있습니다. 여기서 부가정보란, 예를 들어 마우스가 이동하는 이벤트가 발생해서 메세지가 넘어오면, 마우스의 X,Y 좌표 정보와 같은 것들을 뜻합니다. 함수의 본문을 보시면 switch문을 통해 각 메세지별로 처리하는 내용을 정의해놓은 것을 확인할 수 있습니다.
WM_CREATE, WM_DESTROY가 각 메시지입니다. WM_CREATE는 윈도우가 생성되면 발생하는 메세지이고, 응용 프로그램의 오른쪽 위에 있는 X 표시를 누르게 되면 WM_DESTROY 메세지가 발생되어 윈도우가 종료됩니다.
윈도우 핸들에 대한 정보는 있지만, 프로그램에 대한 정보가 없는 것이 의아할 수 있습니다. 프로그램에 대한 정보가 인수로 없는 이유는, 전역 변수(g_hInst)를 선언해 프로그램 정보를 어느 함수에서도 접근할 수 있기 때문입니다.
switch 문으로 메세지를 처리하기 때문에 각 케이스별(메세지별)로 어떻게 처리해야할지 한 눈에 확인할 수 있습니다.
마지막으로, 윈도우 프로시저의 순서도를 보면서 마무리하도록 하겠습니다.
메세지가 발생하면, 메세지 큐에 넣고 윈도우 프로시저로 전달하여 처리하는 모습을 볼 수 있습니다.
여기서 TranslateMessage는 꼭 필요한 과정은 아닙니다. 해당 함수는 문자 정보가 입력되었을 때 어떤 문자인지 해석하여 전달하는 과정으로, 문자가 입력되는 상황이 아니라면 꼭 필요하지 않습니다. (예를 들어, 사용자가 A를 누르면 문자가 눌렸다는 WM_CAHR 라는 메세지가 발생합니다. 이 때, TranslateMessage 함수를 통해서 이 문자가 A임을 알리는 것입니다.)
정리
메세지를 전달받아 처리하는 윈도우 프로시저에 대해서 알아보고 Win32 API에서 제공하는 WndProc 함수에 대해서 알아보았습니다. 이제 각각 메세지를 발생시켜 처리하므로써 프로그램을 작성할 수 있습니다. 다음 포스팅에서는 화면에 선이나 글을 출력하는 것에 대해서 작성해보도록 하겠습니다.
'개발 > Win32 API Programming' 카테고리의 다른 글
[Windows API] Win32 API를 활용해 긴 텍스트, 도형, 메세지박스 출력하기 (0) | 2022.01.02 |
---|---|
[Windows API] Device Context란?, Win32 API를 활용해 문자열 출력하기 (0) | 2021.12.31 |
[Windows API] Win32 API의 기본구조, WinMain-(2) (0) | 2021.11.05 |
[Windows API] 윈도우 프로젝트 생성과 WIN32 API의 기본 구조-(1) (0) | 2021.11.03 |
[Windows API] Win32 API에서 제공하는 자료형(데이터 타입) 모음과 핸들(HANDLE) (0) | 2021.10.07 |