[MFC] 메시지 처리에 대해서..

빵욱·2024년 6월 20일

MFC 메시지 처리??

MFC(Message Framework Class)는 Microsoft Foundation Classes의 약자로, Windows API를 객체 지향적으로 래핑한 라이브러리입니다. MFC에서 메시지 맵(Message Map)을 사용하여 윈도우 메시지를 특정 멤버 함수에 연결할 수 있습니다. 이 구조는 윈도우 프로그래밍에서 중요한 역할을 하며, MFC 애플리케이션에서 이벤트 처리의 기본 메커니즘입니다.

라고 한다.

MFC 어플리케이션의 윈도우 작업표시줄에서 오른쪽 버튼 클릭 + 닫기 버튼을 막는 간단한 작업을 하다 갑자기 메시지에대해 정리해보고 싶어서 적어본다..

메시지 맵의 역할

메시지 맵은 특정 메시지가 발생했을 때 해당 메시지를 처리할 멤버 함수를 정의하는 방법이다.
메시지 맵을 사용하면 메시지 핸들러 함수를 선언하고, 해당 함수가 특정 메시지를 처리하도록 연결할 수 있다고 한다.

메시지 맵의 구조?, 사용 방법?

  1. 메시지 핸들러 선언
    메시지 처리를 하고 싶은 클래스 헤더파일에 핸들러 메서드를 선언한다.
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  1. 메시지 맵 메크로에 사용할 메시지를 적어준다.
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    // 메시지와 핸들러 연결
    ON_WM_SYSCOMMAND()
    ON_REGISTERED_MESSAGE(AFX_WM_TASKBARBUTTONCREATED, &CMainFrame::OnTaskbarButtonCreated)
END_MESSAGE_MAP()

-- 메시지 맵 역할
BEGIN_MESSAGE_MAP과 END_MESSAGE_MAP 매크로는 메시지 맵의 시작과 끝을 정의한다.
BEGIN_MESSAGE_MAP 매크로는 클래스와 해당 클래스의 부모 클래스를 인수로 받는다.
=> BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
이는 클래스 계층 구조를 통해 메시지를 상속받아 처리할 수 있도록 하기 위함이라고 하는데 정확히 무슨 소리인지는 살짝 이해가 가지 않는다..

ON_WM_SYSCOMMAND와 같은 매크로는 특정 메시지를 처리할 멤버 함수를 메시지 맵에 추가한다.
=> 처리하고 싶은 메시지와 핸들러 메서드를 연결하는 것 같은데
ON_WM_SYSCOMMAND() 메크로는 afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 같은 함수 원형을 가리키는 매크로라고 한다.

관련 내용을 더 찾아보니
MFC에서 메시지 맵 매크로는 특정 메시지를 처리할 멤버 함수를 연결하는 역할을 한다고 한다.

ON_WM_SYSCOMMAND를 예로 들면
ON_WM_SYSCOMMAND 매크로는 WM_SYSCOMMAND 메시지를 처리하기 위해 사용된다.
이 매크로는 WM_SYSCOMMAND 메시지가 발생할 때 호출될 함수인 OnSysCommand 함수를 메시지 맵에 추가하는 일을 한다고 한다.

=> 메크로 맵에 메시지 매크로를 추가하면 해당 메시지에 대한 처리를 직접하겠다고 등록하는 것 같음.

결국, ON_WM_SYSCOMMAND() 매크로는 WM_SYSCOMMAND 메시지를 OnSysCommand(UINT nID, LPARAM lParam) 함수와 연결하는 역할을 하고 이 매크로를 통해 MFC 프레임워크는 WM_SYSCOMMAND 메시지가 발생할 때 해당 메시지를 OnSysCommand 함수로 전달하여 처리할 수 있다.

그럼 클래스 cpp 파일에

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == SC_CLOSE)
    {
        return;
    }
    CFrameWnd::OnSysCommand(nID, lParam);
}

OnSysCommand를 구현하면 WM_SYSCOMMAND 메시지가 왔을 때 OnSysCommand 함수를 호출하여 내부 코드에 맞게 처리한다. (헤더파일에는 이미 정의 했다.)
OnSysCommand는 작업표시줄 오른쪽 버튼 + 닫기 동작을 무시하는 코드다.

그럼 이런 메시지 정보는 어떻게 알 수 있나?

MSDN(현재는 Microsoft Docs)에서 찾아보거나 afxwin.h 파일은 MFC의 주요 헤더 파일 중 하나인데 이 헤더 파일을 검색해서 찾을 수 있다고 하는데...
필요할 때 마다 검색해서 찾아야 할 듯..

profile
rove drink eat

0개의 댓글