MFC(Message Framework Class)는 Microsoft Foundation Classes의 약자로, Windows API를 객체 지향적으로 래핑한 라이브러리입니다. MFC에서 메시지 맵(Message Map)을 사용하여 윈도우 메시지를 특정 멤버 함수에 연결할 수 있습니다. 이 구조는 윈도우 프로그래밍에서 중요한 역할을 하며, MFC 애플리케이션에서 이벤트 처리의 기본 메커니즘입니다.
라고 한다.
MFC 어플리케이션의 윈도우 작업표시줄에서 오른쪽 버튼 클릭 + 닫기 버튼을 막는 간단한 작업을 하다 갑자기 메시지에대해 정리해보고 싶어서 적어본다..
메시지 맵은 특정 메시지가 발생했을 때 해당 메시지를 처리할 멤버 함수를 정의하는 방법이다.
메시지 맵을 사용하면 메시지 핸들러 함수를 선언하고, 해당 함수가 특정 메시지를 처리하도록 연결할 수 있다고 한다.
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
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의 주요 헤더 파일 중 하나인데 이 헤더 파일을 검색해서 찾을 수 있다고 하는데...
필요할 때 마다 검색해서 찾아야 할 듯..