U E D R , A S I H C RSS

MFC/Message Map

No older revisions available

No older revisions available



1. MessageMap

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

자료) 자료실

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
    Valid XHTML 1.0! Valid CSS! powered by MoniWiki
    last modified 2021-02-07 05:23:42
    Processing time 0.0555 sec