{{| |}}

1. MessageMap

이벤트의 발생과 함께 전달되는 메시지를 처리하는 메시지 맵에 대한 설명이다. 하단의 소스는 AppWizard가 기본적으로 생성한 코드에서 발췌한 것이다.

자료) 자료실(http://wiki.zeropage.org/jsp-new/pds/pds_read.jsp?page=1&no=23)

2. 사용자 정의 메시지 발생시키기

  • 사용자 정의 메시지란 : 특정한 시점에서 메시지를 보내서 다른 객체의 함수를 실행 시킬수 있다. 굉장히 유용하다. 일종의 콜백 함수 역할을 수행할 수 있는것이다. 즉 어떠한 다른 클래스에서 특정 시점에서 다른 객체의 특정 함수를 실행시켜야 할 필요가 있을때 사용하면 유용하고, 소켓 프로그래밍에서 자주 사용된다.
    • 사용 예 : 어떤 클래스가 view 클래스의 멤버 변수이다. 해당 클래스는 파일을 다운로드 받는 클래스인데 해당 클래스에서 다운로드가 끝났을 경우 view에 있는 serialize 함수를 실행해야 한다. 허나 현재 view클래스가 그 해당 클래스를 멤버로 가지고 있기에 include 로 해당 클래스에서 view 클래스를 포함할 수도 없고, 또 view 클래스의 현재 실행되는 객체를 얻을 방법도 마땅히 없다. 이때 해당 클래스에서 다운로드가 끝난 시점에서 다운로드가 끝났다는 메시지를 발생시켜서 view에 있는 serialize 함수를 실행시킬 수 있다. 이게 바로 사용자 정의 메시지 발생을 이용한 사례..

~cpp
.h // 헤더 파일
#define UM_ACCEPTCLIENT (WM_USER+10) // 사용자 정의 메시지를 정의 한다.
	//}}AFX_MSG
	afx_msg LRESULT OnAcceptClient(WPARAM wParam, LPARAM lParam); // 이부분에 이렇게 정의한 메시지를 실행할 함수를 넣어준다. 함수명은 하고 싶은데로..
	DECLARE_MESSAGE_MAP()

.cpp //구현 파일
begin Message map
ON_MESSAGE(UM_ACCEPTCLIENT, OnAcceptClient) // 이부분에서  UM_ACCEPTCLIENT가 발생하면 OnAcceptClient함수를 실행시킨다고 맵핑한다.
end messagemap

afx_msg LRESULT OnAcceptClient(WPARAM wParam, LPARAM lParam)
{
구현
}	

사용
m_pWnd->SendMessage(UM_ACCEPTCLIENT);	

3. Code Part

in application_name.h
~cpp 
class CEx14App : public CWinApp
{
public:
	CEx14App();

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CEx14App)
	public:
	virtual BOOL InitInstance();
	//}}AFX_VIRTUAL

	// 메시지 맵이 정의된 부분이다.
// Implementation
	//{{AFX_MSG(CEx14App)
	afx_msg void OnAppAbout();		// 위저드로 생성되는 기본 코드에서는 오로지 ID_APP_ABOUT 매시지 만을 처리하는 함수가 존재한다.
		// NOTE - the ClassWizard will add and remove member functions here.
		//    DO NOT EDIT what you see in these blocks of generated code !
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()		// 메시지 맵이 정의된 클래스에는 반드시 이 매크로 함수가 포함되어야 한다.
								// 수동으로 매시지 맵을 추가하려고 한다면 반드시 이 부분을 추가해야한다.
};
매시지를 처리할 수 있는 클래스는 MFC의 계층구조상 CCmdTarget 클래스를 상속받은 클래스라면 어디서든 가능하다.
in application_name.cpp
~cpp 
BEGIN_MESSAGE_MAP(CEx14App, CWinApp)
	//{{AFX_MSG_MAP(CEx14App)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
	// Standard file based document commands
	ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
	ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
	// Standard print setup command
	ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
클래스의 정의 부분에 DECLARE_MESSAGE_MAP()을 포함했다면 그 클래스의 구현 부분에는 반드시 BEGIN_MESSAGE_MAP(), END_MESSAGE_MAP()매크로가 반드시 추가되어야 한다. 이 부분에서는 WM_COMMAND 형태를 갖는 메시지 만을 처리하고 있다.
ON_COMMAND() 매크로 함수는 지정된 메시지 식별자(ID_..)와 특정 함수를 묶어주는 역할을 한다.
in CAboutDlg implementation
~cpp 
class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
		// No message handlers
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

// App command to run the dialog
void CEx14App::OnAppAbout()
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}
작게는 CAboutDlg 도 상기의 조건에 맞추어져서 정의되어 있음을 알 수 있다.

4. 메시지의 종류

window message WM_PAINT, WM_LBUTTONUP과 같은 표준 윈도우 메시지.
control notification message 컨트롤 폼과 같은 것으로 부터 부모 윈도우에게 전달되는 WM_COMMAND메시지이다.
command message 메뉴, 툴바와 같은 UI요소에서 오는 WM_COMMAND 메시지

5. 메시지의 처리 순서

MFC에서는 기본적으로 메시지가 전달되는 특정 순서에 따라서 메시지가 처리되고 처리 코드가 업을 결우 다음 순서의 클래스에서 그 메시지를 처리한다. 결국 그 메시지를 처리하는 코드가 없다면 메시지는 윈도우로 넘겨지고 폐기처리된다.
물론 메시지의 전달 순서를 변경하는 것도 가능하다.

5.1. SDI Application

  • view object(menu object)
  • document object
  • document template object
  • main frame window object
  • application object

5.2. MDI Application

  • view object (activated)
  • document object (linked with view activated)
  • document template object (linked with document activated)
  • frame windows object (linked with view activate)
  • application object

  • 6. Message Identifier Symbol

    WM_COMMAND이외에도 윈도우에는 다양한 식별 심볼들이 있다. 이는 다음과 같다.
    그냥 참고로 이런 파일이 있다는 사실정도는 알아두자.
    in winuser.h
    ~cpp 
    /*
     * Window Messages
     */
    
    #define WM_NULL                         0x0000
    #define WM_CREATE                       0x0001
    #define WM_DESTROY                      0x0002
    #define WM_MOVE                         0x0003
    #define WM_SIZE                         0x0005
    
    #define WM_ACTIVATE                     0x0006
    /*
     * WM_ACTIVATE state values
     */
    #define     WA_INACTIVE     0
    #define     WA_ACTIVE       1
    #define     WA_CLICKACTIVE  2
    
    #define WM_SETFOCUS                     0x0007
    #define WM_KILLFOCUS                    0x0008
    #define WM_ENABLE                       0x000A
    #define WM_SETREDRAW                    0x000B
    #define WM_SETTEXT                      0x000C
    #define WM_GETTEXT                      0x000D
    #define WM_GETTEXTLENGTH                0x000E
    #define WM_PAINT                        0x000F
    #define WM_CLOSE                        0x0010
    #define WM_QUERYENDSESSION              0x0011
    #define WM_QUIT                         0x0012
    #define WM_QUERYOPEN                    0x0013
    #define WM_ERASEBKGND                   0x0014
    #define WM_SYSCOLORCHANGE               0x0015
    #define WM_ENDSESSION                   0x0016
    #define WM_SHOWWINDOW                   0x0018
    #define WM_WININICHANGE                 0x001A
    #if(WINVER >= 0x0400)
    #define WM_SETTINGCHANGE                WM_WININICHANGE
    #endif /* WINVER >= 0x0400 */
    
    
    #define WM_DEVMODECHANGE                0x001B
    #define WM_ACTIVATEAPP                  0x001C
    #define WM_FONTCHANGE                   0x001D
    #define WM_TIMECHANGE                   0x001E
    #define WM_CANCELMODE                   0x001F
    #define WM_SETCURSOR                    0x0020
    #define WM_MOUSEACTIVATE                0x0021
    #define WM_CHILDACTIVATE                0x0022
    #define WM_QUEUESYNC                    0x0023
    
    #define WM_GETMINMAXINFO                0x0024
    // end_r_winuser
    /*
     * Struct pointed to by WM_GETMINMAXINFO lParam
     */
    typedef struct tagMINMAXINFO {
        POINT ptReserved;
        POINT ptMaxSize;
        POINT ptMaxPosition;
        POINT ptMinTrackSize;
        POINT ptMaxTrackSize;
    } MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;
    
    // begin_r_winuser
    #define WM_PAINTICON                    0x0026
    #define WM_ICONERASEBKGND               0x0027
    #define WM_NEXTDLGCTL                   0x0028
    #define WM_SPOOLERSTATUS                0x002A
    #define WM_DRAWITEM                     0x002B
    #define WM_MEASUREITEM                  0x002C
    #define WM_DELETEITEM                   0x002D
    #define WM_VKEYTOITEM                   0x002E
    #define WM_CHARTOITEM                   0x002F
    #define WM_SETFONT                      0x0030
    #define WM_GETFONT                      0x0031
    #define WM_SETHOTKEY                    0x0032
    #define WM_GETHOTKEY                    0x0033
    #define WM_QUERYDRAGICON                0x0037
    #define WM_COMPAREITEM                  0x0039
    #if(WINVER >= 0x0500)
    #define WM_GETOBJECT                    0x003D
    #endif /* WINVER >= 0x0500 */
    #define WM_COMPACTING                   0x0041
    #define WM_COMMNOTIFY                   0x0044  /* no longer suported */
    #define WM_WINDOWPOSCHANGING            0x0046
    #define WM_WINDOWPOSCHANGED             0x0047
    
    #define WM_POWER                        0x0048
    /*
     * wParam for WM_POWER window message and DRV_POWER driver notification
     */
    #define PWR_OK              1
    #define PWR_FAIL            (-1)
    #define PWR_SUSPENDREQUEST  1
    #define PWR_SUSPENDRESUME   2
    #define PWR_CRITICALRESUME  3
    
    #define WM_COPYDATA                     0x004A
    #define WM_CANCELJOURNAL                0x004B
    
    // end_r_winuser
    
    /*
     * lParam of WM_COPYDATA message points to...
     */
    typedef struct tagCOPYDATASTRUCT {
        DWORD dwData;
        DWORD cbData;
        PVOID lpData;
    } COPYDATASTRUCT, *PCOPYDATASTRUCT;
    
    // begin_r_winuser
    
    #if(WINVER >= 0x0400)
    #define WM_NOTIFY                       0x004E
    #define WM_INPUTLANGCHANGEREQUEST       0x0050
    #define WM_INPUTLANGCHANGE              0x0051
    #define WM_TCARD                        0x0052
    #define WM_HELP                         0x0053
    #define WM_USERCHANGED                  0x0054
    #define WM_NOTIFYFORMAT                 0x0055
    
    #define NFR_ANSI                             1
    #define NFR_UNICODE                          2
    #define NF_QUERY                             3
    #define NF_REQUERY                           4
    
    #define WM_CONTEXTMENU                  0x007B
    #define WM_STYLECHANGING                0x007C
    #define WM_STYLECHANGED                 0x007D
    #define WM_DISPLAYCHANGE                0x007E
    #define WM_GETICON                      0x007F
    #define WM_SETICON                      0x0080
    #endif /* WINVER >= 0x0400 */
    
    #define WM_NCCREATE                     0x0081
    #define WM_NCDESTROY                    0x0082
    #define WM_NCCALCSIZE                   0x0083
    #define WM_NCHITTEST                    0x0084
    #define WM_NCPAINT                      0x0085
    #define WM_NCACTIVATE                   0x0086
    #define WM_GETDLGCODE                   0x0087
    #define WM_SYNCPAINT                    0x0088
    #define WM_NCMOUSEMOVE                  0x00A0
    #define WM_NCLBUTTONDOWN                0x00A1
    #define WM_NCLBUTTONUP                  0x00A2
    #define WM_NCLBUTTONDBLCLK              0x00A3
    #define WM_NCRBUTTONDOWN                0x00A4
    #define WM_NCRBUTTONUP                  0x00A5
    #define WM_NCRBUTTONDBLCLK              0x00A6
    #define WM_NCMBUTTONDOWN                0x00A7
    #define WM_NCMBUTTONUP                  0x00A8
    #define WM_NCMBUTTONDBLCLK              0x00A9
    
    #define WM_KEYFIRST                     0x0100
    #define WM_KEYDOWN                      0x0100
    #define WM_KEYUP                        0x0101
    #define WM_CHAR                         0x0102
    #define WM_DEADCHAR                     0x0103
    #define WM_SYSKEYDOWN                   0x0104
    #define WM_SYSKEYUP                     0x0105
    #define WM_SYSCHAR                      0x0106
    #define WM_SYSDEADCHAR                  0x0107
    #define WM_KEYLAST                      0x0108
    
    #if(WINVER >= 0x0400)
    #define WM_IME_STARTCOMPOSITION         0x010D
    #define WM_IME_ENDCOMPOSITION           0x010E
    #define WM_IME_COMPOSITION              0x010F
    #define WM_IME_KEYLAST                  0x010F
    #endif /* WINVER >= 0x0400 */
    
    #define WM_INITDIALOG                   0x0110
    #define WM_COMMAND                      0x0111
    #define WM_SYSCOMMAND                   0x0112
    #define WM_TIMER                        0x0113
    #define WM_HSCROLL                      0x0114
    #define WM_VSCROLL                      0x0115
    #define WM_INITMENU                     0x0116
    #define WM_INITMENUPOPUP                0x0117
    #define WM_MENUSELECT                   0x011F
    #define WM_MENUCHAR                     0x0120
    #define WM_ENTERIDLE                    0x0121
    #if(WINVER >= 0x0500)
    #define WM_MENURBUTTONUP                0x0122
    #define WM_MENUDRAG                     0x0123
    #define WM_MENUGETOBJECT                0x0124
    #define WM_UNINITMENUPOPUP              0x0125
    #define WM_MENUCOMMAND                  0x0126
    #endif /* WINVER >= 0x0500 */
    
    
    #define WM_CTLCOLORMSGBOX               0x0132
    #define WM_CTLCOLOREDIT                 0x0133
    #define WM_CTLCOLORLISTBOX              0x0134
    #define WM_CTLCOLORBTN                  0x0135
    #define WM_CTLCOLORDLG                  0x0136
    #define WM_CTLCOLORSCROLLBAR            0x0137
    #define WM_CTLCOLORSTATIC               0x0138
    
    
    #define WM_MOUSEFIRST                   0x0200
    #define WM_MOUSEMOVE                    0x0200
    #define WM_LBUTTONDOWN                  0x0201
    #define WM_LBUTTONUP                    0x0202
    #define WM_LBUTTONDBLCLK                0x0203
    #define WM_RBUTTONDOWN                  0x0204
    #define WM_RBUTTONUP                    0x0205
    #define WM_RBUTTONDBLCLK                0x0206
    #define WM_MBUTTONDOWN                  0x0207
    #define WM_MBUTTONUP                    0x0208
    #define WM_MBUTTONDBLCLK                0x0209
    
    #if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
    #define WM_MOUSEWHEEL                   0x020A
    #define WM_MOUSELAST                    0x020A
    #else
    #define WM_MOUSELAST                    0x0209
    #endif /* if (_WIN32_WINNT < 0x0400) */
    
    #if(_WIN32_WINNT >= 0x0400)
    #define WHEEL_DELTA                     120     /* Value for rolling one detent */
    #endif /* _WIN32_WINNT >= 0x0400 */
    #if(_WIN32_WINNT >= 0x0400)
    #define WHEEL_PAGESCROLL                (UINT_MAX) /* Scroll one page */
    #endif /* _WIN32_WINNT >= 0x0400 */
    
    #define WM_PARENTNOTIFY                 0x0210
    #define WM_ENTERMENULOOP                0x0211
    #define WM_EXITMENULOOP                 0x0212
    
    #if(WINVER >= 0x0400)
    #define WM_NEXTMENU                     0x0213
    // end_r_winuser
    
    typedef struct tagMDINEXTMENU
    {
        HMENU   hmenuIn;
        HMENU   hmenuNext;
        HWND    hwndNext;
    } MDINEXTMENU, * PMDINEXTMENU, FAR * LPMDINEXTMENU;
    
    // begin_r_winuser
    #define WM_SIZING                       0x0214
    #define WM_CAPTURECHANGED               0x0215
    #define WM_MOVING                       0x0216
    // end_r_winuser
    #define WM_POWERBROADCAST               0x0218      // r_winuser pbt
    // begin_pbt
    
    #define PBT_APMQUERYSUSPEND             0x0000
    #define PBT_APMQUERYSTANDBY             0x0001
    
    #define PBT_APMQUERYSUSPENDFAILED       0x0002
    #define PBT_APMQUERYSTANDBYFAILED       0x0003
    
    #define PBT_APMSUSPEND                  0x0004
    #define PBT_APMSTANDBY                  0x0005
    
    #define PBT_APMRESUMECRITICAL           0x0006
    #define PBT_APMRESUMESUSPEND            0x0007
    #define PBT_APMRESUMESTANDBY            0x0008
    
    #define PBTF_APMRESUMEFROMFAILURE       0x00000001
    
    #define PBT_APMBATTERYLOW               0x0009
    #define PBT_APMPOWERSTATUSCHANGE        0x000A
    
    #define PBT_APMOEMEVENT                 0x000B
    #define PBT_APMRESUMEAUTOMATIC          0x0012
    // end_pbt
    
    // begin_r_winuser
    #define WM_DEVICECHANGE                 0x0219
    
    #endif /* WINVER >= 0x0400 */
    
    #define WM_MDICREATE                    0x0220
    #define WM_MDIDESTROY                   0x0221
    #define WM_MDIACTIVATE                  0x0222
    #define WM_MDIRESTORE                   0x0223
    #define WM_MDINEXT                      0x0224
    #define WM_MDIMAXIMIZE                  0x0225
    #define WM_MDITILE                      0x0226
    #define WM_MDICASCADE                   0x0227
    #define WM_MDIICONARRANGE               0x0228
    #define WM_MDIGETACTIVE                 0x0229
    
    
    #define WM_MDISETMENU                   0x0230
    #define WM_ENTERSIZEMOVE                0x0231
    #define WM_EXITSIZEMOVE                 0x0232
    #define WM_DROPFILES                    0x0233
    #define WM_MDIREFRESHMENU               0x0234
    
    
    #if(WINVER >= 0x0400)
    #define WM_IME_SETCONTEXT               0x0281
    #define WM_IME_NOTIFY                   0x0282
    #define WM_IME_CONTROL                  0x0283
    #define WM_IME_COMPOSITIONFULL          0x0284
    #define WM_IME_SELECT                   0x0285
    #define WM_IME_CHAR                     0x0286
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0500)
    #define WM_IME_REQUEST                  0x0288
    #endif /* WINVER >= 0x0500 */
    #if(WINVER >= 0x0400)
    #define WM_IME_KEYDOWN                  0x0290
    #define WM_IME_KEYUP                    0x0291
    #endif /* WINVER >= 0x0400 */
    
    
    #if(_WIN32_WINNT >= 0x0400)
    #define WM_MOUSEHOVER                   0x02A1
    #define WM_MOUSELEAVE                   0x02A3
    #endif /* _WIN32_WINNT >= 0x0400 */
    
    #define WM_CUT                          0x0300
    #define WM_COPY                         0x0301
    #define WM_PASTE                        0x0302
    #define WM_CLEAR                        0x0303
    #define WM_UNDO                         0x0304
    #define WM_RENDERFORMAT                 0x0305
    #define WM_RENDERALLFORMATS             0x0306
    #define WM_DESTROYCLIPBOARD             0x0307
    #define WM_DRAWCLIPBOARD                0x0308
    #define WM_PAINTCLIPBOARD               0x0309
    #define WM_VSCROLLCLIPBOARD             0x030A
    #define WM_SIZECLIPBOARD                0x030B
    #define WM_ASKCBFORMATNAME              0x030C
    #define WM_CHANGECBCHAIN                0x030D
    #define WM_HSCROLLCLIPBOARD             0x030E
    #define WM_QUERYNEWPALETTE              0x030F
    #define WM_PALETTEISCHANGING            0x0310
    #define WM_PALETTECHANGED               0x0311
    #define WM_HOTKEY                       0x0312
    
    #if(WINVER >= 0x0400)
    #define WM_PRINT                        0x0317
    #define WM_PRINTCLIENT                  0x0318
    
    #define WM_HANDHELDFIRST                0x0358
    #define WM_HANDHELDLAST                 0x035F
    
    #define WM_AFXFIRST                     0x0360
    #define WM_AFXLAST                      0x037F
    #endif /* WINVER >= 0x0400 */
    
    #define WM_PENWINFIRST                  0x0380
    #define WM_PENWINLAST                   0x038F
    
    
    #if(WINVER >= 0x0400)
    #define WM_APP                          0x8000
    #endif /* WINVER >= 0x0400 */
    
    
    /*
     * NOTE: All Message Numbers below 0x0400 are RESERVED.
     *
     * Private Window Messages Start Here:
     */
    #define WM_USER                         0x0400
    
    #if(WINVER >= 0x0400)
    
    /*  wParam for WM_SIZING message  */
    #define WMSZ_LEFT           1
    #define WMSZ_RIGHT          2
    #define WMSZ_TOP            3
    #define WMSZ_TOPLEFT        4
    #define WMSZ_TOPRIGHT       5
    #define WMSZ_BOTTOM         6
    #define WMSZ_BOTTOMLEFT     7
    #define WMSZ_BOTTOMRIGHT    8
    #endif /* WINVER >= 0x0400 */
    
    #ifndef NONCMESSAGES
    
    ----
    MFC
    Retrieved from http://wiki.zeropage.org/wiki.php/MFC/MessageMap
    last modified 2021-02-07 05:23:42