본문 바로가기
Programming/API

API 주요메시지 종류

by 황금표정 2012. 6. 10.

필수 윈도우관련 메시지 정리

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을 리턴.

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함수를 사용한다.

한줄로 간단하게 정리된 윈도우 메시지들 ↓
반응형

'Programming > API' 카테고리의 다른 글

컨트롤(Control)에 대한 기본정리  (0) 2012.12.10
화면 고속캡쳐 참고 사이트  (0) 2012.06.10
몇가지 함수에 대한 정리  (0) 2012.06.10
COLORREF 와 RGB에 대해서  (0) 2012.06.10