3.1 메시지 처리의 기본 개념
윈도우 시스템에서는 사용자의 모든 행위가 메시지 형태로 전달됨
1) 메시지의 종류
윈도우 메시지는 메시지를 처리하는 주체에 따라 윈도우 메시지, 컨트롤 통지 메시지, 그리고 명령 메세지로 나눌 수 있음
[ 윈도우 메시지 ]
- WM_로 시작하는 메시지로 매개변수를 가지고 있어 메시지를 어떻게 처리할 것인지를 결정하는 데 사용 (WM_COMMAND는 제외)
- 윈도우 관리 메시지: 윈도우의 상태가 바뀔 때 발생
- 초기화 메시지: 응용 프로그램이 메뉴나 대화상자를 구성할 때 발생
- 입력 메시지: 마우스, 키보드로 입력할 때 발생
[ 컨트롤 통지 메시지 ]
- Button, Combo Box와 같은 제어 객체나 자식 윈도우에서 부모 윈도우로 보내는 메시지
[ 명령 메시지 ]
- 명령 메시지는 메뉴, 툴바, 엑셀러레이터 키와 같은 사용자 인터페이스 객체로부터 발생하는 WM_COMMAND 메시지
- 명령 메시지는 윈도우뿐만 아니라 도큐먼트, 도큐먼트 템플릿, 뷰, 다른 애플리케이션 객체에 의해 발생할 수도 있음
2) 메시지 맵 (Message Map)
- Win32 SDK 프로그램에서는 윈도우 시스템에서 들어온 메시지를 swich 문을 사용하여 처리
- MFC에서는 메시지 처리를 위해 메시지 맵이라는 메커니즘을 사용하고 있음
- 메시지 맵은 메시지 번호와 메시지가 발생하였을 때 호출되는 함수의 포인터 등의 정보를 가진 테이블로 프로그램에 전달된 메시지와 메시지 핸들러 함수를 연결하는 데 사용
- 메시지 맵에 파생 클래스의 메시지 핸들러 함수를 등록하면 기본 클래스의 함수를 무시하고, 파생 클래스의 함수를 호출해줌
- MFC에서 메시지를 처리하기 위해 필요한 세 가지 단계
- 윈도우 클래스의 멤버 함수로 메시지 핸들러 함수를 선언함
- 메시지 맵에 메시지와 메시지 핸들러 함수를 묶는 메시지의 매크로를 추가함
- 메시지 핸들러 함수의 기능을 구현함
3) 메시지 핸들러 (Message Handler) 함수
- 윈도우로부터 애플리케이션에 메시지가 전달될 때 해당 메시지를 처리하는 멤버 함수
- 함수 이름은 윈도우 메시지 이름을 따서 윈도우 메시지의 WM_을 떼고, 대신 On을 붙여서 시작하고 함수 선언 시에 afx_msg를 붙여 메시지 핸들러 함수라는 것을 나타냄
- 사용자가 어떤 동작을 취하면 윈도우 시스템은 프로그램에게 그 동작을 알려주기 위해 프로그램의 메시지 큐에 메시지를 넣어주고 프로그램은 메시지 큐에서 하나씩 메시지를 꺼내어 그 메시지에 해당하는 함수를 호출해줌
- 윈도우 메시지와 함께 추가로 들어온 정보는 메시지 핸들러 함수에서 처리될 수 있도록 그 함수의 인자로 넘겨줌
자주 사용하는 윈도우 관리 메시지와 메시지 핸들러 함수
메시지 유형 | 발생 상황 | 메시지 핸들러 함수 |
WM_CREATE | 윈도우가 생성될 때 | OnCreate() |
WM_ACTIVE | 윈도우가 활성화될 때 | OnActive() |
WM_PAINT | 윈도우가 다시 그려져야 될 때 | OnPaint() |
WM_SIZE | 윈도우가 생성될 때 윈도우가 크기가 변경될 때 | OnSize() |
WM_MOVE | 윈도우가 움직일 때 | OnMove() |
WM_TIMER | 설정된 타이머 시간이 됐을 때 | OnTimer() |
WM_DESTROY | 윈도우가 종료될 때 | OnDestroy() |
3.2 메시지 박스 (Message Box)
- 사용자에게 간단한 메시지를 출력하는 데 사용되는 대화상자
- 메시지 박스를 출력하려면 AfxMessageBox() 함수를 이용함
① 메시지 핸들러 함수 선언
② 메시지 매크로 추가
- 메시지 맵은 BEGIN_MESSAGE_MAP()으로 시작해서 END_MESSAGE_MAP()으로 끝남
- BEGIN_MESSAGE_MAP()과 END_MESSAGE_MAP() 사이에는 메시지 엔트리로 구성되고 메시지 맵에서는 여러 개의 메시지를 처리할 수 있으므로 하나 이상의 메시지 엔트리를 추가할 수 있음
- BEGIN_MESSAGE_MAP() 매크로는 두 개의 클래스 이름을 인자로 가짐
- 첫 번째 인자인 CPractice3aView 클래스는 메시지 맵이 속하는 클래스 이름이고, 두 번째 인자인 CView 클래스는 CPractice3aView 클래스의 기본 클래스임
- 여기서 기본 클래스의 이름을 같이 적어주는 것은 만약 메시지가 CPractice3aView 클래스의 메시지 맵에서 일치하는 메시지 핸들러 함수를 찾지 못하면 기저 클래스인 CView 클래스의 메시지 맵에서 메시지 핸들러 함수를 찾게 됨
③ 메시지 핸들러 함수 구현
'New > MFC 윈도우 프로그래밍' 카테고리의 다른 글
3. 메시지 처리 (3) (0) | 2024.12.14 |
---|---|
3. 메시지 처리 (2) (0) | 2024.12.11 |
2. MFC 개요 및 아키텍처 (2) (0) | 2024.12.07 |
2. MFC 개요 및 아키텍처 (1) (0) | 2024.12.02 |
1. 윈도우 프로그래밍의 이해 (3) (3) | 2024.11.29 |