hahahia

window 빈 창 띄우는 예제(2) 본문

Windows Programming/Windows::API

window 빈 창 띄우는 예제(2)

hahahia 2012. 5. 8. 23:14

소스코드 보기 => GO


WinMain 함수에서 하는 가장 중요한 일은 윈도우를 만드는 일이다. 윈도우가 있어야 사용자로부터 입력을 받을 수 있고 출력을 보여줄 수도 있기 때문이다. 윈도우를 만드려면 윈도우 클래스를 먼저 등록한 후 CreateWindow 함수를 호출해야 한다. 모든 윈도우는 클래스를 기반으로 하여 만들어지며, 윈도우 클래스는 만들어질 윈도우의 여러가지 특성을 정의한다. 윈도우 클래스는 windows.h에 다음과 같이 정의되어 있는 구조체이다.


typedef struct tagWNDCLASS

{

    UINT        style;

    WNDPROC     lpfnWndProc;

    int         cbClsExtra;

    int         cbWndExtra;

    HINSTANCE   hInstance;

    HICON       hIcon;

    HCURSOR     hCursor;

    HBRUSH      hbrBackground;

    LPCSTR      lpszMenuName;

    LPCSTR      lpszClassName;

} WNDCLASS;


이 인자들에 대한 자세한 내용은 winapi.co.kr 참고


ATOM RegisterClass( CONST WNDCLASS *lpWndClass);


RegisterClass 함수의 인수로 WndClass 구조체의 번지를 넘겨주면 된다.이런 특성을 가진 윈도우를 앞으로 사용하겠다는 등록 과정이다. 소스의 앞부분을 보면 WNDCLASS 구조체의 각 멤버에 값을 대입하고 윈도우 클래스를 등록하는 코드가 있다.


윈도우 클래스를 등록한 후에는 등록한 윈도우 클래스를 기본으로 윈도우를 실제 생성해야 한다. 윈도우를 생성할 때는 CreateWindow 함수를 사용한다.


HWND CreateWindow(lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hwndParent, hmenu, hinst, lpvParam) 


이 인자들에 대한 자세한 내용은 winapi.co.kr 참고


BOOL ShowWindow(hWnd, nCmdShow); 

hWnd 인수는 화면으로 출력하고자 하는 윈도우의 핸들이며 CreateWindow 함수가 리턴한 핸들을 그대로 넘겨주면 된다. nCmdShow는 윈도우를 화면에 출력하는 방법을 지정하며 다음과 같은 매크로 상수들이 정의되어 있다.



윈도우가 만들어지는 과정을 도식화


윈도우즈 프로그램에서 메시지를 처리하는 부분을 메시지 루프라고 하며 보통 WinMain 함수의 끝에 다음과 같은 형식으로 존재한다.


while(GetMessage(&Message,0,0,0)) {

TranslateMessage(&Message);

DispatchMessage(&Message);

}


BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); 

이 함수는 시스템이 유지하는 메시지 큐에서 메시지를 읽어들인다. 메시지는 첫번째 인수가 지정하는 MSG 구조체에 저장된다. 읽어들인 메시지가 WM_QUIT일 경우 False를 리턴, 그 외의 메시지이면 WM_QUIT 메시지가 읽혀질 때까지, 즉 프로그램이 종료될 때까지 전체 while 루프가 계속 실행된다. 나머지 세 개의 인수는 읽어들일 메시지의 범위를 지정하는데 잘 사용되지 않으므로 일단 무시하기로 한다.


BOOL TranslateMessage( CONST MSG *lpMsg); 

키보드 입력 메시지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 해 준다. 이 함수는 키보드의 눌림(WM_KEYDOWN)과 떨어짐(WM_KEYUP)이 연속적으로 발생할 때 문자가 입력되었다는 메시지(WM_CHAR)를 만드는 역할을 한다. 예를 들어 A키를 누른 후 다시 A키를 떼면 A문자가 입력되었다는 메시지를 만들어 낸다.


LONG DispatchMessage( CONST MSG *lpmsg); 

시스템 메시지 큐에서 꺼낸 메시지를 프로그램의 메시지 처리 함수(WndProc)로 전달. 이 함수에 의해 메시지가 프로그램으로 전달되며 프로그램에서는 전달된 메시지를 점검하여 다음 동작을 결정하게 된다.



실제 메시지 처리는 별도의 메시지 처리 함수(WndProc)에서 수행한다. 메시지는 시스템의 변화에 대한 정보이며 MSG라는 구조체에 보관된다. MSG 구조체는 다음과 같이 정의되어 있다.


typedef struct tagMSG

{

    HWND        hwnd; // 어떤 종류의 메시지인가를 나타낸다

    UINT        message;

    WPARAM      wParam;

    LPARAM      lParam;

    DWORD       time;

    POINT       pt;

} MSG;


GetMessage 함수는 읽은 메시지를 MSG형의 구조체에 대입해 주며 이 구조체는 DispatchMessage 함수에 의해 응용 프로그램의 메시지 처리 함수(WndProc)로 전달된다.


참고 | winapi.co.kr


Comments