MFC 中消息(附:WM_消息种类及对应消息处理函数一览表)

Published

MFC消息处理基本机制


MFC的思想是所有类继承自基类CObject,每个类都拥有一个消息映射表和各自的成员
通常开发者自定义的窗口是继承自CDialog的,整个继承链为:

MyDialog->CDialog->CWnd->CCmdTarget->CObject

当遇到消息时,会从本类的消息映射表中匹配处理对应消息的函数,如果没有找到则去父类的消息映射表中寻找,以此类推
如果直到CObject类的消息映射表寻找完都没有函数处理消息,则将消息放入默认处理函数中处理(与Windows32API的思想一致)

 

MFC中消息映射机制流程

MFC中的消息映射机制是在OnWndMsg()这个函数中实现的,而在这个函数里又会去查找相应的消息映射的宏。

以下面MFC工程Draw为例:

OnWndMsg会在CDrawTest.h中查找,看看DECLARE_MESSAGE_MAP()之上,两个afx_msg注释宏之间是否有相应的消息响应函数的原型声明

protected:  
    //{{AFX_MSG(CDrawView)  
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    //函数OnLButtonDown()的原型声明  
    //}}AFX_MSG  
    DECLARE_MESSAGE_MAP() 

再到CDrawView.cpp中,看看BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()这两个宏之间是否有相应的消息映射宏

// CDrawView.cpp  
  
IMPLEMENT_DYNCREATE(CDrawView, CView)  
  
BEGIN_MESSAGE_MAP(CDrawView, CView)  
    //{{AFX_MSG_MAP(CDrawView)  
    ON_WM_LBUTTONDOWN() //函数OnLButtonDown()在消息映射宏之中  
    //}}AFX_MSG_MAP  
    // Standard printing commands  
    ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)  
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)  
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)  
END_MESSAGE_MAP()  

如果通过前两个步骤,找到了消息响应函数,那么接着就会调用该响应函数,对消息进行处理。 如果子类中没有找到消息响应函数,那么就就给基类处理。

MFC中ON_UPDATE_COMMAND_UI和ON_COMMAND消息区别

ON_COMMAND消息是响应打开菜单的命令的 
ON_UPDATE_COMMAND_UI是你打开这个菜单时,处理这个菜单的状态,比如选中、变灰等等。

 

 

ON_WM_ACTIVATE( ) afx_msg void OnActivate( UINT, CWnd*,BOOL ) 
ON_WM_ACTIVATEAPP( ) afx_msg void OnActivateApp( BOOL,HANDLE ) 
ON_WM_ASKCBFORMATNAME( ) afx_msg void OnAskCbFormatName( UINT,LPSTR ) 
ON_WM_CANCELMODE( ) afx_msg void OnCancelMode( ) 
ON_WM_CAPTURECHANGED( ) afx_msg void OnCaptureChanged( CWnd* ) 
ON_WM_CHANGECBCHAIN( ) afx_msg void OnChangeCbChain( HWND, HWND ) 
ON_WM_CHAR( ) afx_msg void OnChar( UINT, UINT,UINT ) 
ON_WM_CHARTOITEM( ) afx_msg int OnCharToItem( UINT,CWnd*, UINT ) 
ON_WM_CHILDACTIVATE( ) afx_msg void OnChildActivate( ) 
ON_WM_CLOSE( ) afx_msg void OnClose( ) 
ON_WM_COMPACTING( ) afx_msg void OnCompacting( UINT ) 
ON_WM_COMPAREITEM( ) afx_msg int OnCompareItem( LPCOMPAREITEMSTRUCT ) 
ON_WM_CONTEXTMENU( ) afx_msg void OnContextMenu( CWnd*, CPoint ) 
ON_WM_COPYDATA( ) afx_msg BOOL OnCopyData( CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct ) 
ON_WM_CREATE( ) afx_msg int OnCreate( LPCREATESTRUCT ) 
ON_WM_CTLCOLOR( ) afx_msg HBRUSH OnCtlColor( CDC*, CWnd*, UINT )
ON_WM_DEADCHAR( ) afx_msg void OnDeadChar( UINT, UINT, UINT ) 
ON_WM_DELETEITEM( ) afx_msg void OnDeleteItem( LPDELETEITEMSTRUCT ) 
ON_WM_DESTROY( ) afx_msg void OnDestroy( ) 
ON_WM_DESTROYCLIPBOARD( ) afx_msg void OnDestroyClipboard( ) 
ON_WM_DEVICECHANGE( ) afx_msg void OnDeviceChange( UINT, DWORD ) 
ON_WM_DEVMODECHANGE( ) afx_msg void OnDevModeChange( LPSTR ) 
ON_WM_DRAWCLIPBOARD( ) afx_msg void OnDrawClipboard( ) 
ON_WM_DRAWITEM( ) afx_msg void OnDrawItem( LPDRAWITEMSTRUCT ) 
ON_WM_DROPFILES( ) afx_msg void OnDropFiles( HDROP ) 
ON_WM_ENABLE( ) afx_msg void OnEnable( BOOL ) 
ON_WM_ENDSESSION( ) afx_msg void OnEndSession( BOOL ) 
ON_WM_ENTERIDLE( ) afx_msg void OnEnterIdle( UINT,CWnd* ) 
ON_WM_ERASEBKGND( ) afx_msg BOOL OnEraseBkgnd( CDC * )
ON_WM_FONTCHANGE( ) afx_msg void OnFontChange( ) 
ON_WM_GETDLGCODE( ) afx_msg UINT OnGetDlgCode( ) 
ON_WM_GETMINMAXINFO( ) afx_msg void OnGetMinMaxInfo( LPPOINT ) 
ON_WM_HELPINFO( ) afx_msg BOOL OnHelpInfo( HELPINFO* ) 
ON_WM_HSCROLL( ) afx_msg void OnHScroll( UINT, UINT,CWnd* ) 
ON_WM_HSCROLLCLIPBOARD() afx_msg void OnHScrollClipboard( CWnd*, UINT, UINT) 
ON_WM_ICONERASEBKGND( ) afx_msg void OnIconEraseBkgnd( CDC* ) 
ON_WM_INITMENU( ) afx_msg void OnInitMenu( CMenu* ) 
ON_WM_INITMENUPOPUP( ) afx_msg void OnInitMenuPopup( CMenu*, UINT, BOOL ) 
ON_WM_KEYDOWN( ) afx_msg void OnKeyDown( UINT, UINT, UINT ) 
ON_WM_KEYUP( ) afx_msg void OnKeyUp( UINT, UINT, UINT ) 
ON_WM_KILLFOCUS( ) afx_msg void OnKillFocus( CWnd* )
ON_WM_LBUTTONDBLCLK( ) afx_msg void OnLButtonDblClk( UINT, Cpoint ) 
ON_WM_LBUTTONDOWN( ) afx_msg void OnLButtonDown( UINT, CPoint ) 
ON_WM_LBUTTONUP( ) afx_msg void OnLButtonUp( UINT, CPoint ) 
ON_WM_MBUTTONDBLCLK( ) afx_msg void OnMButtonDblClk( UINT, CPoint ) 
ON_WM_MBUTTONDOWN( ) afx_msg void OnMButtonDown( UINT, CPoint ) 
ON_WM_MBUTTONUP( ) afx_msg void OnMButtonUp( UINT, CPoint ) 
ON_WM_MDIACTIVATE( ) afx_msg void OnMDIActivate( BOOL, CWnd*, CWnd* ) 
ON_WM_MEASUREITEM( ) afx_msg void OnMeasureItem( LPMEASUREITEMSTRUCT ) 
ON_WM_MENUCHAR( ) afx_msg LONG OnMenuChar( UINT, UINT, CMenu* ) 
ON_WM_MENUSELECT( ) afx_msg void OnMenuSelect( UINT, UINT, HMENU ) 
ON_WM_MOUSEACTIVATE( ) afx_msg int OnMouseActivate( CWnd*, UINT, UINT ) 
ON_WM_MOUSEMOVE( ) afx_msg void OnMouseMove( UINT, CPoint ) 
ON_WM_MOUSEWHEEL( ) afx_msg BOOL OnMouseWheel( UINT, short, CPoint ) 
ON_WM_MOVE( ) afx_msg void OnMove( int, int ) 
ON_WM_MOVING( ) afx_msg void OnMoving( UINT, LPRECT )
ON_WM_NCACTIVATE( ) afx_msg BOOL OnNcActivate( BOOL ) 
ON_WM_NCCALCSIZE( ) afx_msg void OnNcCalcSize( BOOL, NCCALCSIZE_PARAMS FAR* ) 
ON_WM_NCCREATE( ) afx_msg BOOL OnNcCreate( LPCREATESTRUCT ) 
ON_WM_NCDESTROY( ) afx_msg void OnNcDestroy( ) 
ON_WM_NCHITTEST( ) afx_msg UINT OnNcHitTest( CPoint ) 
ON_WM_NCLBUTTONDBLCLK( ) afx_msg void OnNcLButtonDblClk( UINT, CPoint ) 
ON_WM_NCLBUTTONDOWN( ) afx_msg void OnNcLButtonDown( UINT, CPoint ) 
ON_WM_NCLBUTTONUP( ) afx_msg void OnNcLButtonUp( UINT, CPoint ) 
ON_WM_NCMBUTTONDBLCLK( ) afx_msg void OnNcMButtonDblClk( UINT, CPoint ) 
ON_WM_NCMBUTTONDOWN( ) afx_msg void OnNcMButtonDown( UINT, CPoint ) 
ON_WM_NCMBUTTONUP( ) afx_msg void OnNcMButtonUp( UINT, CPoint ) 
ON_WM_NCMOUSEMOVE( ) afx_msg void OnNcMouseMove( UINT, CPoint ) 
ON_WM_NCPAINT( ) afx_msg void OnNcPaint( ) 
ON_WM_NCRBUTTONDBLCLK( ) afx_msg void OnNcRButtonDblClk( UINT, CPoint ) 
ON_WM_NCRBUTTONDOWN( ) afx_msg void OnNcRButtonDown( UINT, Cpoint ) 
ON_WM_NCRBUTTONUP( ) afx_msg void OnNcRButtonUp( UINT, CPoint ) P-R
ON_WM_PAINT( ) afx_msg void OnPaint( ) 
ON_WM_PAINTCLIPBOARD( ) afx_msg void OnPaintClipboard( CWnd*, HANDLE ) 
ON_WM_PALETTECHANGED( ) afx_msg void OnPaletteChanged( CWnd* ) 
ON_WM_PALETTEISCHANGING( ) afx_msg void OnPaletteIsChanging( CWnd* ) 
ON_WM_PARENTNOTIFY( ) afx_msg void OnParentNotify( UINT, LONG ) 
ON_WM_QUERYDRAGICON( ) afx_msg HCURSOR OnQueryDragIcon( ) 
ON_WM_QUERYENDSESSION( ) afx_msg BOOL OnQueryEndSession( ) 
ON_WM_QUERYNEWPALETTE( ) afx_msg BOOL OnQueryNewPalette( ) 
ON_WM_QUERYOPEN( ) afx_msg BOOL OnQueryOpen( ) 
ON_WM_RBUTTONDBLCLK( ) afx_msg void OnRButtonDblClk( UINT, CPoint ) 
ON_WM_RBUTTONDOWN( ) afx_msg void OnRButtonDown( UINT, CPoint ) 
ON_WM_RBUTTONUP( ) afx_msg void OnRButtonUp( UINT, CPoint ) 
ON_WM_RENDERALLFORMATS( ) afx_msg void OnRenderAllFormats( ) 
ON_WM_RENDERFORMAT( ) afx_msg void OnRenderFormat( UINT )
ON_WM_SETCURSOR( ) afx_msg BOOL OnSetCursor( CWnd*, UINT, UINT ) 
ON_WM_SETFOCUS( ) afx_msg void OnSetFocus( CWnd* ) 
ON_WM_SHOWWINDOW( ) afx_msg void OnShowWindow( BOOL, UINT ) 
ON_WM_SIZE( ) afx_msg void OnSize( UINT, int, int ) 
ON_WM_SIZECLIPBOARD( ) afx_msg void OnSizeClipboard( CWnd*, HANDLE ) 
ON_WM_SIZING( ) afx_msg void OnSizing( UINT, LPRECT ) 
ON_WM_SPOOLERSTATUS( ) afx_msg void OnSpoolerStatus( UINT, UINT ) 
ON_WM_STYLECHANGED( ) afx_msg void OnStyleChanged( int, LPSTYLESTRUCT ) 
ON_WM_STYLECHANGING( ) afx_msg void OnStyleChanging( int,LPSTYLESTRUCT ) 
ON_WM_SYSCHAR( ) afx_msg void OnSysChar( UINT, UINT, UINT ) 
ON_WM_SYSCOLORCHANGE( ) afx_msg void OnSysColorChange( ) 
ON_WM_SYSCOMMAND( ) afx_msg void OnSysCommand( UINT, LONG ) 
ON_WM_SYSDEADCHAR( ) afx_msg void OnSysDeadChar( UINT, UINT, UINT ) 
ON_WM_SYSKEYDOWN( ) afx_msg void OnSysKeyDown( UINT, UINT, UINT ) 
ON_WM_SYSKEYUP( ) afx_msg void OnSysKeyUp( UINT,UINT, UINT )
ON_WM_TCARD( ) afx_msg void OnTCard( UINT, DWORD ) 
ON_WM_TIMECHANGE( ) afx_msg void OnTimeChange( ) 
ON_WM_TIMER( ) afx_msg void OnTimer( UINT ) 
ON_WM_VKEYTOITEM( ) afx_msg int OnVKeyToItem( UINT, CWnd*, UINT ) 
ON_WM_VSCROLL( ) afx_msg void OnVScroll( UINT, UINT, CWnd* ) 
ON_WM_VSCROLLCLIPBOARD( ) afx_msg void OnVScrollClipboard( CWnd*, UINT, UINT ) 
ON_WM_WINDOWPOSCHANGED( ) afx_msg void OnWindowPosChanged( WINDOWPOS* lpwndpos ) 
ON_WM_WINDOWPOSCHANGING( ) afx_msg void OnWindowPosChanging( WINDOWPOS* lpwndpos ) 
ON_WM_WININICHANGE( ) afx_msg void OnWinIniChange( LPSTR )