4 messages in Windows C++
다음과 같이 message는 크게 4가지 종류로 구분할 수 있다.
1. Window Message
Window message는 WM_XXX 형태의 message로 Windows OS에 의해 발생. Message handler 이름과 Message map에 사용되는 macro 명은 이미 정해져 있기 때문에 이름을 임의로 부여할 수 없다. 예를 들어, WM_XXX의 경우 message handler 이름은 OnXXX이고 message map에 사용되는 macro명은 ON_WM_XXX로 된다. WM_KEYDOWN message의 경우 다음과 같다.
Message handler 이름
afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );
Message map에 사용되는 marco
ON_WM_KEYDOWN()
2. Notification Message
Notification message는 표준 control이 자신의 부모 Window (일반적으로 dialog)에게 보내는 message이다. 예를 들어, 사용자가 dialog 상의 button을 click하면 button control은 dialog에게 notification message(BN_CLICKED) 를 보낸다. BN_CLICKED는 button control 자신이 현재 사용자에 의해 click 되었음을 부모 window에게 알려주는 역할을 한다. 여기서 접두어 BN_는 Button Notify가 되며, combo box의 경우 CBN_ (ComboBox Notify), edit control은 EN_ (Edit Notify)이 접두어로 붙는다.
3. User Defined Message
User defined message는 progrmmer 자신이 필요에 의해 만든 message를 말한다. Macro ON_MESSAGE()를 사용하며 [ClassWizard]를 사용할 수 없기 때문에 수작업으로 mapping하여야 한다.
Message handler name
afx_msg LONG MyFunc( UINT wParam, LONG lParam);
Used macro in macro map
ON_MESSAGE( <message>, <MyFunc> )
Message handelr 이름은 programmer 임의대로 부여할 수 있지만, return type과 parameter 개수, type은 반드시 일치시켜야 한다. Macro ON_MESSAGE()의 경우 첫번째 parameter는 message ID, 두번째 인자는 message handler 이름을 필요로 한다.
4. System Registered Message
Program에서 정의한 message 중 RegisterWindowMessage() 함수를 이용하여 Windows system에 등록한 message를 말한다. Macro ON_REGISTERED_MESSAGE()를 사용하며 [ClassWizard]를 사용할 수 없기 때문에 수작업으로 mapping하여야 한다.
Message handler name
afx_msg LONG MyFunc( UNIT wParam, LONG lParam);
Macro using in the message map
ON_REGISTERED_MESSAGE( <nMessageVariable>, <MyFunc> )
Message handler 이름은 programmer 마음대로 부여할 수 있지만, return type과 parameter 개수, type은 반드시 일치시켜야 한다. Macro ON_REGISTERED_MESSAGE()의 경우 첫번째 인자는 message value, 두번째 parater는 message handler 이름을 필요로 한다. 첫번째 parameter message 값은 함수 RegisterWindowMessage()가 return한 값이다.
source: Chapter 6, Microsoft Visual C++ Bible 6.0, 이이표, 김병세 공저, 삼양출판사