출처: http://cafe.naver.com/ryuts.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=19
필수 윈도우관련 메시지 정리
● WM_CREATE
² CreateWindow() 함수에 의해 메인 윈도우가 생성된 직후에 화면에 보여지기 전에 보내지는 메시지.
² 각종 초기화를 하기에 적합한 장소.
² 참고로, 대화상자는 이 메시지 대신 WM_INITDIALOG 메시지를 받는다.
² wParam : 사용되지 않음.
² lParam : 윈도우 생성정보인 CREATESTRUCT 구조체의 포인터.
● WM_DESTROY
² 윈도우가 파괴될 때 보내지는 메시지.
² 각종 마무리 작업 하기에 적합한 장소.
² 사용자가 DestroyWindow 함수를 호출할 때, 윈도우가 파괴되는데, 이 함수 호출 결과로 WM_DESTROY 메시지가 전달된다.
² 사용자가 Alt+F4 혹은 닫기 버튼을 누를 경우, WM_CLOSE 메시지가 전달되며 이 메시지를 별도로 처리하지 않으면 DefWindowProc은 Destroywindow함수를 호출하여 윈도우를 파괴한다.
² 파괴되는 윈도우가 메인 윈도우의 경우, PostQuitMessage 함수를 반드시 호출하여 프로세스의 메시지 루프를 종료하도록 해야한다. 이 처리를 생략하면, 윈도우만 파괴되고, 메시지 루프는 계속 실행중인 상태가 되므로 프로세스가 종료되지 않는다.
● WM_ACTIVATE
² 윈도우의 활성화 상태가 변경될 때 보내지는 메시지로써, 새로 활성화되는 윈도우와 비활성화 되는 윈도우에게 동시에 보내진다.
² 활성화 상태는 오직 하나만 존재할 수 있다.
² LOWORD(wParam) : 윈도우가 활성화 되었는지 비활성화 되었는지의 정보.
n ⓐ WA_ACTIVE : 마우스 클릭 이외의 방법으로 활성화 됨. (SetActiveWindow() 함수를 호출했거나, Alt+Tab, Alt+Esc 등의 단축키로 활성화 되었을 경우)
n ⓑ WA_CLICKACTIVE : 마우스 클릭에 의해 활성화 됨.
n ⓒ WA_INACTIVE : 비 활성화 됨.
² HIWORD(wParam) : 윈도우의 최소화 상태를 전달. 최소화 되어있으면 0 이외의 값을 가짐.
² lParam : 활성화 상태가 변경된 다른 윈도우의 핸들이 전달. 즉, 활성화 상태가 바뀐 상대편 윈도우의 핸들 값이다. 상대편 윈도우가 없을 경우는 NULL이 전달.
● WM_CLOSE
² 윈도우가 닫히기 전에 전달되는 메시지이며, 메인윈도우인 경우는 프로그램이 종료된다는 신호임.
² 이 메시지를 처리하지 않고 DefWindowProc으로 보내면 DestroyWindow함수를 호출하여 윈도우를 파괴하도록 한다.
² 이 메시지가 전달되었을 때는 아직 윈도우가 파괴된 것이 아니므로, 메시지박스의 취소 등을 통해 윈도우가 파괴되는 것을 중간에 차단할 수 있다.
● WM_SIZE
² 윈도우의 크기가 변경될 때 전달된다. (사용자가 윈도우 경계선을 드래그해서 직접 크기를 변경할 때 혹은 내부에서 MoveWindow, SetWindowPos 등의 함수로 윈도우의 크기를 변경할 때 등)
² wParam : 윈도우의 크기가 변경된 이유와 유형 값을 가짐
n ⓐ SIZE_MAXHIDE : 다른 윈도우가 최대화되어 이 윈도우가 가려졌다.
n ⓑ SIZE_MAXIMIZED : 윈도우가 최대화되었다.
n ⓒ SIZE_MAXSHOW : 다른 윈도우가 원래 크기로 복구되어 이 윈도우가 드러났다.
n ⓓ SIZE_MINIMIZED : 윈도우가 최소화되었다.
n ⓔ SIZE_RESTORED : 윈도우의 크기가 변경되었다.(윈도우의 크기를 사용자가 드래그 등으로 직접 변경할 때)
² lParam : 윈도우의 변경된 후의 크기. LOWORD(lParam)-> 윈도우의 폭, HIWORD(lParam)-> 윈도우의 높이.
² 사용예) 윈도우 가운데에 문자를 출력하는 프로그램이라면, 윈도우 크기가 변경될 때마다 다시 출력해줘야한다.
● WM_MOVE
² 윈도우의 위치가 변경되면 이 메시지가 보내진다. (위치가 완전히 옮겨진 후에 보내짐)
² LOWORD(lParam) : 새로 옮겨진 윈도우의 X좌표
² HIWORD(wParam) : 새로 옮겨진 윈도우의 Y좌표. 차일드 윈도우는 부모 윈도우의 작업 영역을 기준으로 한 좌표임.
● WM_SHOWWINDOW
² 윈도우의 보임 상태가 변경되기 직전에 보내지는 메시지.
² 사용예) 애니메이션이 돌고 있다가 윈도우가 가려지면 굳이 리소스 낭비하면서 돌릴 이유가 없다. 잠깐 멈췄다가 다시 보여지면 애니매이션을 이어서 돌린다는지의 작업.
² wParam : TRUE 이면 윈도우가 보여지는 것이고, FASLE이면 윈도우가 숨겨지는 것이다.
² lParam : 이 메시지가 전달된 이유이다. 0이면 ShowWindow()함수에 의해 이 메시지가 전달된 것이며, 0이 아니면 다음 값 중 하나가 된다. (많이 사용되지는 않음)
ⓐ SW_OTHERRUNZOOM : 다른 윈도우가 최대화되었다가 복구 또는 최소화됨으로써 이 윈도우가 보여지게 되었다.
ⓑ SW_OTHERZOOM : 다른 윈도우가 최대화되면서 이 윈도우가 가려지게 되었다.
ⓒ SW_PARENTCLOSING : 부모 윈도우가 최소화되었다.
ⓓ SW_PARENTOPENING : 부모 윈도우가 복구되었다.
● 그 밖에 메시지들..
² WM_ERASEBKGND : 윈도우의 크기가 변경되었거나 다른 윈도우에 가려진 부분이 드러났다거나 할 때 배경을 지우기 위해 이 메시지가 보내진다. WM_PAINT에서 작업 영역에 출력을 하기 전에 먼저 전에 그려져있던 내용을 지워야한다. 이 메시지를 처리하지 않을 경우 DefWindowProc은 배경 브러시로 작업 영역을 지운 후 WM_PAINT에서 출력을 내보내게 된다.
² WM_HSCROLL : 수평 스크롤바를 클릭 할 때 발생
² WM_VSCROLL : 수직 스크롤바를 클릭 할 때 발생
² WM_COMMAND : 메뉴 항목을 선택 했을 때 발생
² WM_CONTEXTMENU : 팝업 메뉴 전용 메시지
필수 윈도우관련 함수 정리
● GetWindowRect() 함수
BOOL GetWindowRect(HWND hWnd, LPRECT lpRect);
² 윈도우의 현재 위치를 lpRect를 통해 좌표값으로 알려준다. (전체화면을 기준으로 한 좌표임)
² 윈도우의 크기를 구하고 싶으면, right-left, bottom-top을 계산하면 된다.
● GetClientRect() 함수
BOOL GetClientRect(HWND hWnd, LPRECT lpRect);
² 윈도우의 작업영역(ClientArea) 크기를 계산해준다.
² 작업영역이란, 윈도우의 타이틀바, 스크롤바, 경계선, 메뉴 등을 제외한 영역이다.
² lpRect의 left, top은 항상 0이며, right, bottom이 곧 윈도우의 크기를 나타낸다.
● ShowWindow() 함수
BOOL ShowWindow(HWND hWnd, int nCmdShow);
² 윈도우의 보이기/숨기기/최대화/최소화/복구상태 등 현재 상태를 지정한다.
² nCmdShow : 지정하고자 하는 보이기 상태이며, 다음 값 중 하나를 지정한다.
u SW_SHOW, SW_HIDE, SW_MAXMIZE, SW_MINIMIZE, SW_RESTORE 등..
² 리턴값 : 윈도우가 이전에 보이던 상태였다면 0이 아닌값을 리턴, 보이지 않던 상태였다면 0을 리턴.
※ SW_SHOW, SW_HIDE 를 받는 쪽 처리
case WM_ACTIVATE:
if(LOWORD(wParam) == WA_INACTIVE)//SW_SHOW
strcpy(Mes, “비활성화 상태”);
else //SW_HIED
strcpy(Mes, “활성화 상태”);
InvalidateRect(hWnd, NULL, TRUE);
return 0;
// wParam ; TRUE-활성화 , FALSE-비활성화
// lParam ; 활성화 상태가 변경될 때 상대편 윈도우를 소유한 스레드
// ID 가 전달된다. // WM_ACTIVATE 메시지
// LOWORD(wParam) –
// WA_INACTIVE ; 비활성화
// WA_CLICKATIVE ; 마우스 클릭에 의해 윈도우 활성화
// WA_ACTIVE ; 마우스 클릭 이외의 방법에 의해 윈도우 활성화
// HIWORD(wParam) – 윈도우가 최소화 상태인가 아닌가를 전달해
// 주는데 상위 워드가 0이외의 값을 가지면
// 윈도우가 최소화 되어 있는것이다.
// lParam – 윈도우의 활성화/비활성화에 따라 활성화가 변경된
// 상대편 윈도우의 핸들이 전달된다.
● MoveWindow() 함수
BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
² 윈도우의 위치와 크기를 변경하는 가장 일반적인 함수.
² X, Y : 윈도우의 위치를 지정.
² nWidth, nHeight : 윈도우의 폭과 높이를 지정.
² bRepaint : 이동 후에 윈도우를 다시 그릴 것인가 여부. TRUE면 이동 후 WM_PAINT 메시지를 보내 윈도우를 다시 그리도록 한다. 이때 작업영역, 비작업영역 다 그려지게 된다.
² 인자를 통해 위치는 물론 크기까지 한꺼번에 변경할 수 있다. 만약 위치만 변경하고 싶다면, GetWindowRect를 통해 영역을 구한 다음 원하는 값만 변경하는 식으로 처리한다. 만약 크기만 변경하고 싶다면, SetWindowPos함수를 사용한다