본문 바로가기

Programming/Win32&MFC&COM

MFC 사용자 정의 메시지 처리

반응형

WM_CREATE, WM_PAINT 등의 메시지는 이미 정의되어 있는 윈도우 메시지입니다.

WM_ 접두어는 윈도우 메시지를 위해서 사용됩니다.

이런 기본적으로 정의된 메시지 외에 사용자가 정의한 메시지를 처리할 경우도 존재합니다.

UI 스레드를 추가해서 스레드간 통신에도 사용할 수 있습니다.

간단한 MFC 프로젝트를 생성합니다.

Dialog based로 변경하고 Finish를 눌러서 생성합니다.

Dlg.cpp(앞에 프로젝트명이 붙습니다.) 파일에 Message Map이 정의되어 있습니다.

BEGIN_MESSAGE_MAP(CUMTestDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()

메시지와 해당 메시지를 처리하는 핸들러 함수가 연결되어 있습니다.

다만 WM_으로 시작되는 메시지에 대해서는 핸들러 함수의 이름이 고정되어 있습니다.

ON_WM_PAINT()는 다음과 같이 정의되어 있습니다.

#define ON_WM_PAINT() \
	{ WM_PAINT, 0, 0, 0, AfxSig_vv, \
		(AFX_PMSG)(AFX_PMSGW) \
		(static_cast< void (AFX_MSG_CALL CWnd::*)(void) > ( &ThisClass :: OnPaint)) },

클래스의 OnPaint() 함수를 통해서 처리된다는 것을 확인할 수 있습니다.

사용자 메시지를 stdafx.h 파일에 추가합니다.

#define UM_MYMESSAGE WM_USER + 1

WM_USER 메시지에 값을 더해서 메시지를 정의하면 됩니다.

이 메시지를 처리할 핸들러를 Dlg.h 파일의 클래스 내부에 선언합니다.

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

함수의 구조는 LRESULT FunctionName(WPARAM, LPARAM)입니다.

이제 함수의 구현 내용을 작성하면 됩니다.

LRESULT CUMTestDlg::OnMyMessage(WPARAM /*wParam*/, LPARAM /*lParam*/)
{
	AfxMessageBox(_T("Hello!!"));
	return 0;
}

마지막으로 Message Map에 메시지와 핸들러를 연결하면 됩니다.

BEGIN_MESSAGE_MAP(CUMTestDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	/* Connect Message and Handler */
	ON_MESSAGE(UM_MYMESSAGE, &CUMTestDlg::OnMyMessage)
	/* Connect Message and Handler */
END_MESSAGE_MAP()

현재 Message Map에 ON_MESSAGE를 추가했습니다.

이제 UM_MYMESSAGE 메시지가 전달되면 해당 함수가 호출이 됩니다.

메시지가 정상적으로 처리되는지 확인하기 위해서 OnInitDialog()에 다음 코드를 추가합니다.

this->PostMessage(UM_MYMESSAGE, 0, 0);

메시지가 정상적으로 뜨면 정상적으로 처리가 된 것입니다.






반응형
  • MFC 초보 2016.12.15 16:40

    꼼꼼한 설명 감사드립니다.

    대부분의 다른 곳은 대부분 말로 떼우거나 대충 개념만 훑어주는데

    그림으로 하나하나, 어디어디에 뭐 넣어라까지 알려주셔서 초보자들에겐 큰 도움이 됩니다.

    감사합니다.