본문 바로가기
New/MFC 윈도우 프로그래밍

3. 메시지 처리 (1)

by onenewkong 2024. 12. 8.

3.1 메시지 처리의 기본 개념

윈도우 시스템에서는 사용자의 모든 행위가 메시지 형태로 전달됨

1) 메시지의 종류

윈도우 메시지는 메시지를 처리하는 주체에 따라 윈도우 메시지, 컨트롤 통지 메시지, 그리고 명령 메세지로 나눌 수 있음

[ 윈도우 메시지 ]

  • WM_로 시작하는 메시지로 매개변수를 가지고 있어 메시지를 어떻게 처리할 것인지를 결정하는 데 사용 (WM_COMMAND는 제외)
  • 윈도우 관리 메시지: 윈도우의 상태가 바뀔 때 발생
  • 초기화 메시지: 응용 프로그램이 메뉴나 대화상자를 구성할 때 발생
  • 입력 메시지: 마우스, 키보드로 입력할 때 발생

[ 컨트롤 통지 메시지 ]

  • Button, Combo Box와 같은 제어 객체나 자식 윈도우에서 부모 윈도우로 보내는 메시지

[ 명령 메시지 ]

  • 명령 메시지는 메뉴, 툴바, 엑셀러레이터 키와 같은 사용자 인터페이스 객체로부터 발생하는 WM_COMMAND 메시지
  • 명령 메시지는 윈도우뿐만 아니라 도큐먼트, 도큐먼트 템플릿, 뷰, 다른 애플리케이션 객체에 의해 발생할 수도 있음

2) 메시지 맵 (Message Map)

  • Win32 SDK 프로그램에서는 윈도우 시스템에서 들어온 메시지를 swich 문을 사용하여 처리
  • MFC에서는 메시지 처리를 위해 메시지 맵이라는 메커니즘을 사용하고 있음
  • 메시지 맵은 메시지 번호와 메시지가 발생하였을 때 호출되는 함수의 포인터 등의 정보를 가진 테이블로 프로그램에 전달된 메시지와 메시지 핸들러 함수를 연결하는 데 사용
  • 메시지 맵에 파생 클래스의 메시지 핸들러 함수를 등록하면 기본 클래스의 함수를 무시하고, 파생 클래스의 함수를 호출해줌
  • MFC에서 메시지를 처리하기 위해 필요한 세 가지 단계
    1. 윈도우 클래스의 멤버 함수로 메시지 핸들러 함수를 선언함
    2. 메시지 맵에 메시지와 메시지 핸들러 함수를 묶는 메시지의 매크로를 추가함
    3. 메시지 핸들러 함수의 기능을 구현함

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