Windows API 프로그래밍 -1. 윈도우 메세지 처리. -
윈도우 프로그래밍을 하는데 기본적으로 윈도우와 C언어의 차이점은 main 함수와 WinMain 함수를 사용하는것에서 차이가 있다. 라고 했었다.
하지만, 차이점은 이것 뿐만 아니다.
일반적으로 C언어에서는 while을 이용해서 프로그램의 키 입력을 항상 기다리고 있는 것이다.
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <stdlib.h> int main() { char data = 0; while(1) { data = getc(stdin); if(data == 'q') { break; } printf("%c", data); } return 0; } | cs |
이렇게 하면 q을 받게 되면, 탈출하는 형태로 처리가 된다.
이와 유사하게 윈도우에서도 메세지라는 장치를 이용해서 윈도우를 컨트롤한다.
전 소스를 보면, 다음과 같은 부분이 보일 것이다.
1 2 3 4 5 | while(GetMessage(&Message,0,0,0)) { TranslateMessage(&Message); DispatchMessage(&Message); } | cs |
이 부분이 main.c에 적혀있는
while(1) 부분과 동일하다고 볼 수 있다.
GetMessage에는 Message에 대한 정보를 가지고 있고, 이 정보를 클래스에서 적용시킨
WndClass.lpfnWndProc=(WNDPROC)WndProc;
여기에 있는 WndProc라는 함수에 연결을 하도록 만들어 져 있다.
WndProc은 운영체제에서 보내주는 이벤트를 받아서 해당 값을 처리하게 되어있다.
여기서 이벤트란, 사용자가 컴퓨터에게 주는 행위들을 전부 다 이벤트라고 보면 된다.
예을 들어서 키보드에 있는 키를 입력하는 것이나 마우스를 이동시키는 것 또한, 이벤트이다. 버튼을 누르는 것도 이벤트로 취급이 된다.
이 이벤트를 개발자는 보고 원하는 형태로 작동하도록 만드는 것이고, 이것을 주고 받는 매개가 Message이다.
이벤트에 관련된 정보를 WndProc에게 준 후에 WndProc에서 전부 다 컨트롤 하도록 되어 있다.
그래서 이전 소스의 WndProc을 본다면,
1 2 3 4 5 6 7 8 9 10 | LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) { switch(iMessage) { case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd,iMessage,wParam, lParam); } | cs |
여기서 iMessage로 해당 이벤트의 정보를 받아 들이고, 해당 이벤트에 맞춰서 프로그램이 행동하도록 하게 된다.
WM_DESTORY는 윈도우가 파괴 되었을 경우. 즉, 윈도우 창을 닫게 했을 경우를 뜻한다. PostQuitMessage()을 사용하여, 프로그램을 종료하는 메세지를 보낸다.
종료하는 메세지를 받은 프로그램은 결국 전체적인 프로그램을 종료하는 작업을 하게 된다.