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);
메시지가 정상적으로 뜨면 정상적으로 처리가 된 것입니다.
'Programming > Win32&MFC&COM' 카테고리의 다른 글
Dialog 내부에 FormView 추가하기 (2) | 2015.07.08 |
---|---|
SDI(or MDI)에서 View를 포함하는 Dialog 띄울 때 문제점 (0) | 2015.07.02 |
SDI Document/View 구조 제거하기 (1) | 2015.06.23 |
CString 토큰(Token)으로 분리시키기(AfxExtractSubString) (0) | 2015.06.22 |
BOM(Byte Order Mark)에 따른 파일 처리 (0) | 2015.06.21 |