사용자 정의 이벤트(Event)
MFC 를 사용하면서 이벤트를 등록하는 방법
(보통 View 클래스에 등록을 많이 하므로 기준을 View클래스에 두고 설명 한다.)
1.View클래스 헤더 파일에 #define WM_<이름> (WM_USER+숫자)
이렇게 정의한다.
#define WM_SUN (WM_USER+2)
2. 헤더 상단 하단 부분의 DECLARE_MESSAGE_MAP 에 SendMessage가 호출하게 되는 afx_msg 함수를 정의한다.protected://Generated message map functions//{{AFX_MSG(CProgressBar_TWO) afx_msg LRESULT TestSUN(WPARAM,LPARAM);//}}AFX_MSGDECLARE_MESSAGE_MAP()
3.클래스의 cpp파일로 와서 상단의 BEGIN_MESSAGE_MAP에 함수와 이벤트를
연결한다.
BEGIN_MESSAGE_MAP(...,...)//{AFX_MSG_MAP(...) ON_MESSAGE(WM_SUN,TestSUN)//}AFX_MSG_MAPEND_MESSAGE_MAP()4.함수를 정의한다.LRESULT xxxView::TestSUN(WPARAM,LPARAM){.....}
////////////////////////////////////////////////////////////
MFC에서는 Message 처리기를 구현하기 위해 Message Map(리스트)을 이용하는데, 이 리스트의 각 항목을 나타내는 구조체 타입이 AFX_MSGMAP_ENTRY(afxwin.h에 정의되어 있음)이다.
struct AFX_MSGMAP_ENTRY
{
UINT nMessage; // windows message
UINT nCode; // control code or WM_NOTIFY code
UINT nID; // control ID (or 0 for windows messages)
UINT nLastID; // used for entries specifying a range of control id's
UINT_PTR nSig; // signature type (action) or pointer to message #
AFX_PMSG pfn; // routine to call (or special value)
};
실제 MFC 구현 코드에서 BEGIN_MESSAGE_MAP ~ END_MESSAGE_MAP (이 매크로가 구현하는 함수들은 DECLARE_MESSAGE_MAP 매크로를 통하여 해당 클래스에 선언된다) 사이에 삽입되는 매크로들이 각 이벤트 처리기를 정의하는 AFX_MSGMAP_ENTRY 타입의 항목들이다. MFC에서 기본적으로 제공되는 Message Map을 위한 매크로들은 afxmsg_.h에 정의되어 있다.
여기서 사용자 지정 이벤트 처리기를 구현하는 것이 목적이기 때문에, 우선 다음과 같이 사용자 이벤트를 정의한다.
#define WM_USERDEFINE WM_USER+13
다음은 Message Map에 추가할 Entry를 정의하는 매크로를 작성한다. (다음의 예제 코드에서는 하나의 void 타입 인자와 void 타입 반환을 가진 이벤트 처리기 함수로 정의하고 있다.)
#define ON_WM_USERDEFINE() \
{ WM_USERDEFINE, 0, 0, 0, AfxSig_vv, \
(AFX_PMSG)(AFX_PMSGW) \
(static_cast< void (AFX_MSG_CALL CWnd::*)(void) > ( &ThisClass :: OnUserDefine)) },
나머지는 OnUserDefine 함수를 구현하여 해당 클래스의 afx_msg 멤버로 추가하면 된다.
'C & C++ > C & C++' 카테고리의 다른 글
[Tip] 키 조합으로 프로그램 종료하기 (응용가능) (0) | 2011.05.04 |
---|---|
API 주요 함수 (0) | 2011.04.29 |
[Tip] 로그인 인증 확인 (0) | 2011.04.28 |
[공통] 메모리 누수 추적 (0) | 2011.04.28 |
CFileDialog::GetFolderPath() 에러 대처법 (0) | 2011.04.28 |
댓글