윈도우 어플리케이션 (1) : WinMain, WinProc
WndProc : 메시지가 발생할때 WinMain이 아닌 윈도우에서 직접 호출하며 프로그램 반응을 처리하는 함수
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) {
switch(iMessage) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
- hWnd : 메시지를 받을 윈도우 핸들
- iMessage : 메시지 종류 (WM_DESTROY는 윈도우가 파괴됨을 알리는 메시지)
- wParam, lParam : 메시지에 따른 부가적인 파라미터. 예를들어 WM_LBUTTONDOWN 메시지가 전달되면 화면 어디에선가 버튼이 눌러졌다는것이고, 그때 마우스좌표나 키보드 상황(Shift, Ctrl, Alt) 등에 대한 정보를 전달해준다.
WM_DESTROY 메시지는 Alt+F4나 닫기버튼을 이용해서 프로그램을 끝낼때 발생하고, PostQuitMessage 함수를 호출하면 WM_QUIT 메시지를 보내서 메시지루프의 GetMessage 함수 리턴값을 False로 만들어서 프로그램이 종료된다.
DefWindowProc 함수는 윈도우에게 처리를 넘기는 디폴트 메시지처리 함수이다.
WinMain : 윈도우즈 프로그램의 시작점
- hInstance : 프로그램의 인스턴스 핸들. 인스턴스는 프로그램이 실행될때 메모리에 올라온 개체라고 보면된다.
- hPrevInstance : 바로앞에 실행된 현재 프로그램의 인스턴스 핸들. 없는경우 NULL. 16bit의 호환성을 위해 존재함
- lpszCmdInstance : 프로그램 실행 시 명령행으로 입력된 프로그램 인수. (argv)
- nCmdShow : 프로그램이 실행될 형태. 최소화 보통 최대화 등
WNDCLASS : 만들어질 윈도우의 특성을 정의. 세팅 후 RegisterClass 함수를 통해 구조체를 등록하고 CreateWindow 함수로 윈도우를 생성한다.
- lpfnWndProc : 메세지 처리함수 이름
- lpszClassName : 이 윈도우 클래스의 이름. CreateWindow함수에 전달되어야 해서 같은값을 사용해야한다.
CreateWindow(lpszClassName, Title, dwStyle, x, y, nWidth, nHeight, hwndParent, hmenu, hinst, lpvParam)
- dwStype : 윈도우의 형태를 플래그로 설정하는 값. 크기조절가능여부, 타이틀, 스크롤바의 유무 등을 지정할수있다.
- hWndParant : 부모 윈도우 핸들값을 의미. NULL로 지정하는경우 바탕화면이 부모윈도우가되며 바탕화면 어디나 돌아다닐수 있게 만들어진다.
- hmenu : 메뉴의 핸들을 지정. WNDCLASS에서 정의한 메뉴를 사용하려면 NULL로 세팅한다.
while(GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
윈도우 프로그램은 보통 맨 아래에서 While문으로 루프를 돌며 메시지를 처리한다.
GetMessage : 시스템이 유지하는 메시지큐에서 메시지를 읽어들이고 WM_QUIT메시지가 전달되면 False를 리턴한다.
TranslateMessage : 키보드 입력 메시지를 프로그램에서 쉽게 쓸수있도록 가공해준다.
DispatchMessage : 시스템 메시지 큐에서 메시지를 꺼내 프로그램의 메시지처리 함수인 WinProc로 전달한다.