연습

Windows API 프로그래밍 -1. 윈도우 메세지 처리. -

JunkMam 2016. 6. 17. 00:00

 윈도우 프로그래밍을 하는데 기본적으로 윈도우와 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()을 사용하여, 프로그램을 종료하는 메세지를 보낸다.

 종료하는 메세지를 받은 프로그램은 결국 전체적인 프로그램을 종료하는 작업을 하게 된다.