ㅇ 윈도우즈 시스템
- 윈도우즈를 메시지 구동 시스템(Message Driven System)이라고 함 , 도스와 윈도우의 차이점
- 윈도우즈는 메시지(상황)에 따라 실행 순서가 달라짐 , 도스는 미리 입력된 순차적 실행
ㅇ 메시지
- 사용자나 시스템 내부적인 동작에 의해 발생된 일체의 변화에 대한 정보
ex) 마우스 버튼클릭
- 메시지가 발생하면 프로그램에서는 메시지가 어떤 정보를 담고 있는가를 분석하여 어떤 루틴을 호출 할것인가를 결정
ㅇ 메시지 루프
- 윈도우 프로그램에서 메시지를 처리하는 부분을 메시지 루프라고 함
- 보통 WinMain 함수의 끝에 다음과 같은 형식으로 존재
while(GetMessage(&Message,0,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
- 세개의 함수 호출로 이루어져 있다
ㅇ GetMessage
BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
- 시스템이 유지하는 메시지 큐에서 메시지를 읽어 들인다.
- 읽은 메시지는 첫번째 인수가 지정하는 MSG 구조체에 저장된다.
- 메시지가 WM_QUIT일 경우 False를 리턴(프로그램 종료), 그 외의 메시지 True를 리턴
- 나머지 세게의 인수는 메시지의 범위를 지정하는 데 사용
ㅇ TranslateMessage
BOOL TranslateMessage( CONST MSG *lpMsg);
- 키보드 입력 메시지를 가공해 준다.
- 키보드의 어떤 키가 눌려졌거나 떨어졌을 경우 키보드 메시지를 발생시킨다
==> WM_KEYDOWN , WM_KEYUP가 연속적으로 발생할 때 메시지(WM_CHAR )를 만드는 역할
ex) A키를 눌렸다가 때면 A문자가 입력되었는 메시지를 만든다.
ㅇ DispatchMessage
NG DispatchMessage( CONST MSG *lpmsg);
- 시스템 메시지 큐에서 꺼낸 메시지를 프로그램의 메시지 처리 함수(WndProc)로 전달
- 이 함수에 의해 메시지가 프로그램으로 전달된다.
※ 메시지 루프가 하는 일은 WM_QUIT 메시지가 전달뙬때까지 반복하면서 메시지를 꺼내고, 필요한 경우 약간 형태를 바꾼 후 응용 프로그램으로 전달하는 것
실제 처리는 메시지 처리 함수(WinProc)가 한다.
ㅇ MSG 구조체
typedef struct tagMSG
{
HWND hwnd; /// 메시지를 받은 윈도우 핸들
UINT message; /// 어떤 종류의 메세지가를 나타냄, 가장 중요
WPARAM wParam; /// 전달된 메시지에 대한 부가적인 정보, 의미는 메시지 마다 다름 32비트값
LPARAM lParam; /// 전달된 메시지에 대한 부가적인 정보, 의미는 메시지 마다 다름 32비트값
DWORD time; /// 메시지가 발생한 시간
POINT pt; /// 메시지가 발생했을때 마우스의 위치
} MSG;
ㅇ 자주 사용되는 메시지
- WM_QUIT : 프로그램 종료될때
- WM_LBUTTONDOWN : 마우스 왼쪽 버튼 클릭
- WM_CHAR : 키보드로 부터 문자가 입력될때
- WM_PAINT : 화면을 다시 그려야 할때
- WM_DESTROY : 윈도우가 메모리에서 파괴될때
- WM_CREATE : 윈도우가 처음 만들어질때
※ 메시지 루프가 종료되면 프로그램은 마지막으로 Message.wParam을 리턴하고 종료한다. 이 값은 WM_QUIT 메시지로부터 전달된 탈출 코드(exit code)이다.
ps : 자세한 내용은 www.WinAPI.co.kr 참고
'[ C/ C++ 프로그래밍 ] > [ WinAPI ]' 카테고리의 다른 글
파일 불러 올때 상대 경로를 설정 방법 (1) | 2010.06.30 |
---|---|
[Windows Api 정복 정리 ] DC(Device ConText) (0) | 2010.06.01 |
[Windows Api 정복 정리 ] 메시지 처리 함수 (WinProc) (1) | 2010.05.31 |
[Windows Api 정복 정리 ] WinMain & 윈도우 클래스 (1) | 2010.05.31 |
[Windows Api 정복 정리 ] 기초 (0) | 2010.05.31 |