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

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

Posted by JunkMam
,