개발자 '쑥말고인절미'

[MFC] ON_MESSAGE() 본문

STUDY/C++ & MFC

[MFC] ON_MESSAGE()

쑥말고인절미 2024. 8. 5. 20:39

요약

'ON_MESSAGE()'는 MFC 애플리케이션에서 사용자 정의 메시지를 처리할 때 사용하는 매크로이다. 이 매크로를 사용하여 특정 사용자 정의 메시지가 발생할 때 호출할 함수와 메시지를 연결할 수 있다. 이를 통해 개발자는 표준 윈도우 메시지 외에 자신만의 메시지를 정의하고 처리할 수 있다.

ON_MESSAGE()

  • 사용자 정의 메시지 핸들러를 클래스에 연결하는데 사용한다. 사용자 정의 메시지랑 애플리케이션에서 사용자가 정의한 메시지로, 주로 윈도우 시스템 표준 메시지 외에 추가적으로 필요할 때 사용된다.

사용목적

  • 'WM_COMMAND', 'WM_PAINT' 등의 표준 윈도우 메시지와 관련된 핸들러 함수를 클래스에 연결하기 위해 메시지 맵(message map)이라는 매커니즘을 사용한다. 이 메시지 맵은 'BEGIN_MESSAGE_MAP'과 'END_MESSAGE_MAP' 매크로로 감싸져 있으며, 메시지 맵 내부에 메시지와 이를 처리할 멤버 함수의 연결이 정의된다.
  • ON_MESSAGE()는 이러한 메시지 맵에 사용자 정의 메시지와 해당 메시지를 처리할 멤버 함수를 연결하기 위해 사용된다. 사용자 정의 메시지는 'WM_USER' 이상 범위에서 정의된 메시지를 사용하며, 특정 작업이나 이벤트를 처리하기 위해 사용자가 직접 정의한 메시지이다.

사용예시

// 사용자 정의 메시지 정의
// 헤더 파일 (MyClass.h)
#define WM_USER_CUSTOM (WM_USER + 1) // 사용자 정의 메시지


// 메시지 헨들러 함수 선언
// 헤더 파일 (MyClass.h)
class CMyClass : public CWnd {
public:
    afx_msg LRESULT OnUserCustom(WPARAM wParam, LPARAM lParam);
    DECLARE_MESSAGE_MAP()
};


// 메시지 핸들러 함수 구현
// 소스 파일 (MyClass.cpp)
LRESULT CMyClass::OnUserCustom(WPARAM wParam, LPARAM lParam) {
    // 메시지를 처리하는 코드
    AfxMessageBox(_T("Custom message received!"));
    return 0;
}


// 메시지 맵 설정
// 소스 파일 (MyClass.cpp)
BEGIN_MESSAGE_MAP(CMyClass, CWnd)
    ON_MESSAGE(WM_USER_CUSTOM, &CMyClass::OnUserCustom)
END_MESSAGE_MAP()

매크로 동작 원리

  • ON_MESSAGE() 매크로는 두 가지 주요 인자를 받는다.
    1.  메시지 ID : 처리할 사용자 정의 메시지의 식별자 이다. 보통 'WM_USER'이상의 값을 사용하여 정의한다.
    2.  메시지 핸들러 함수 포인터 : 해당 메시지가 발생했을 때 호출될 클래스 멤버 함수의 포인터이다.
  • 메시지 맵에 'ON_MESSAGE(WM_USER_CUSTOM, &MyClass::OnUserCustom)'을 추가함으로써, MFC는 'WM_USER_CUSTOM'메시지가 발생할 때 'OnUserCustom' 함수를 호출하도록 내부적으로 연결을 설정한다.