MFC消息和消息映射机制整理

本文详细梳理了MFC中消息映射的使用,包括DECLARE_MESSAGE_MAP()和BEGIN_MESSAGE_MAP()宏的声明,以及各种控件通知消息和系统消息的处理函数。例如ON_WM_PAINT()用于窗口部分重绘,ON_WM_SIZE()处理窗口大小变化,ON_WM_ACTIVATE()涉及窗口激活状态等。此外,还介绍了不同类型的Windows消息及其对应的成员函数,涵盖了从窗口创建到关闭的各个阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MFC消息和消息映射机制整理

使用示例

  • 在头文件的类(比如MyDialog)的声明中指定:
    DECLARE_MESSAGE_MAP()
    
  • 在对应的cpp文件中指定:
    BEGIN_MESSAGE_MAP(MyDialog, CDialog)
        ON_WM_PAINT()
        // 以下放其他的消息映射函数
    END_MESSAGE_MAP()
    
  • 实现对应的消息函数
    // h文件
    afx_msg void OnPaint();
    // cpp文件
    void MyDialog::OnPaint()
    {
        // TODO    
    }
    

消息类型

控件通知消息

消息开头控件类型
ON_STN_XXXStatic control notification codes
ON_EN_XXXEdit Control Notification Codes
ON_ACN_XXXAnimation Control Notification Codes
ON_BN_XXXUser Button Notification Codes
ON_LBN_XXXListbox Notification Codes
ON_CLBN_CHKCHANGECheck Listbox Notification codes
ON_CBN_XXXCombo Box Notification Codes

用户自定义,用户自己使用的消息

消息类型用途
ON_MESSAGEfor Windows messages
ON_REGISTERED_MESSAGEfor Registered Windows messages
ON_THREAD_MESSAGEfor Thread messages
ON_REGISTERED_THREAD_MESSAGEfor Registered Windows messages

Windows系统消息

消息类型对应消息函数用途或调用时机
ON_WM_CREATEOnCreate应用程序通过Create或者CreateEx函数时会调用该函数
ON_WM_COPYDATAOnCopyData两个应用程序相互拷贝数据时使用
ON_WM_DESTROYOnDestroy窗口对象从屏幕中移除会调用该函数
父窗口调用该函数结束后才调用子窗口的OnDestroy函数
ON_WM_MOVEOnMove窗口的位置发生变化后调用该函数,参数是新的x,y坐标
ON_WM_SIZEOnSize窗口的大小变化后调用该函数,参数程序cx,cy是新的客户端区域的宽高
ON_WM_ACTIVATEOnActivate窗口激活和失活都会调用该函数,nState指定的是即将要变化到的状态
ON_WM_SETFOCUSOnSetFocus窗口获取输入焦点后会调用该函数
ON_WM_KILLFOCUSOnKillFocus窗口失去输入焦点前会立即调用该函数
ON_WM_ENABLEOnEnable应用程序改变窗口的enable状态时会调用该函数
ON_WM_HELPINFOOnHelpInfo用户按下F1键时调用
ON_WM_PAINTOnPaint应用程序发出请求绘制窗口的一部分的时候调用
ON_WM_SYNCPAINTOnSyncPaint
ON_WM_CLOSEOnClose应用程序或者窗口对象将要终结时调用
ON_WM_QUERYENDSESSIONOnQueryEndSession用户选择结束Windows session或者应用程序调用ExitWindows时调用
ON_WM_QUERYOPENOnQueryOpen当窗口对象处于最小化状态时,用户请求窗口恢复到其先前的大小和位置时调用
ON_WM_ERASEBKGNDOnEraseBkgnd当窗口对象的背景需要擦除时调用该函数
ON_WM_SYSCOLORCHANGEOnSysColorChange当系统的颜色设置发生变化时,所有的top-level窗口会调用该函数
ON_WM_ENDSESSIONOnEndSessionOnQueryEndSession返回非0值调用该函数
ON_WM_WTSSESSION_CHANGEOnSessionChange调用该函数以通知应用程序session的状态发生改变
ON_WM_SHOWWINDOWOnShowWindow窗口对象将要隐藏或将要显示前调用
ON_WM_CTLCOLOROnCtlColor子控件将要绘制前调用
ON_WM_CTLCOLOR_REFLECTCtlColor
ON_WM_SETTINGCHANGEOnSettingChange当Win32 系统参数信息函数改变了系统设置时,所有的top-level窗口调用该函数
ON_WM_WININICHANGEOnWinIniChangeWIN.INI文件发生变化时,调用该函数
ON_WM_DEVMODECHANGEOnDevModeChange用户改变了device-mode设置时,所有的top-level窗口调用该函数
ON_WM_ACTIVATEAPPOnActivateApp应用程序的所有top-level窗口即将被激活或失活时调用
ON_WM_FONTCHANGEOnFontChange应用程序改变了font资源池时调用
ON_WM_TIMECHANGEOnTimeChange系统时间改变时调用该函数
ON_WM_CANCELMODEOnCancelMode调用该函数以取消任意的内部模式
ON_WM_SETCURSOROnSetCursor鼠标输入没有被捕获到,并且鼠标光标在窗口对象中移动时调用该函数
ON_WM_MOUSEACTIVATEOnMouseActivate鼠标光标在一个非激活窗口内部,此时用户按下鼠标按钮后,调用该函数
ON_WM_CHILDACTIVATEOnChildActivate当窗口对象是MDI结构的子窗口时,当用户点击窗口的title bar或者窗口被激活、移动、改变大小时调用该函数
ON_WM_GETMINMAXINFOOnGetMinMaxInfo当Windows想要知道窗口最大化时的位置和窗口大小或者minimum or maximum tracking size时调用
ON_WM_ICONERASEBKGNDOnIconEraseBkgnd针对的是最小化时的窗口对象,在其icon被绘制前,其icon的背景必须被填满
ON_WM_SPOOLERSTATUSOnSpoolerStatus当一项任务被添加到Print Manager的队列或者从队列中移出时调用该函数
ON_WM_DRAWITEMOnDrawItem对于一个owner窗口来说,其own的子控件(比如owner-draw button control, combo-box control, list-box control, or menu)发生改变时调用该函数
ON_WM_DRAWITEM_REFLECTDrawItem
ON_WM_MEASUREITEMOnMeasureItemThe framework calls this member function by the framework for the owner of an owner-draw button, combo box, list box, or menu item when the control is created
ON_WM_MEASUREITEM_REFLECTMeasureItem
ON_WM_DELETEITEMOnDeleteItemThe framework calls this member function to inform the owner of an owner-draw list box or combo box that the list box or combo box is destroyed or that items have been removed by CComboBox::DeleteString, CListBox::DeleteString, CComboBox::ResetContent, or CListBox::ResetContent.
ON_WM_DELETEITEM_REFLECTDeleteItem
ON_WM_CHARTOITEMOnCharToItem针对带LBS_WANTKEYBOARDINPUT样式的list box,该控件向其owner发送一个WM_CHARTOITEM消息以响应WM_CHAR消息
ON_WM_VKEYTOITEMOnVKeyToItem针对带LBS_WANTKEYBOARDINPUT样式的list box,该控件会发送WM_VKEYTOITEM以响应WM_KEYDOWN消息
ON_WM_VKEYTOITEM_REFLECTVKeyToItem
ON_WM_QUERYDRAGICONOnQueryDragIcon当窗口处于最小化时,但是窗口类中没有指定icon会调用该函数
ON_WM_COMPAREITEMOnCompareItem当在已排序的owner-draw combo或者list box中指定一个新项时会调用该函数
ON_WM_COMPAREITEM_REFLECTCompareItem
ON_WM_COMPACTINGOnCompacting
ON_WM_NCCREATEOnNcCreate当窗口对象在第一次创建时会比WM_CREATE消息先调用该函数
ON_WM_NCDESTROYOnNcDestroy非客户端区域即将销毁时调用该函数,且该函数是窗口对象被销毁时最后一个调用的函数
ON_WM_NCCALCSIZEOnNcCalcSize窗口的客户端区域的位置和大小需要被重新计算时调用该函数
ON_WM_NCHITTESTOnNcHitTest每一次鼠标光标移动到窗口对象上或者窗口对象显式调用SetCapture函数来获取鼠标输入时调用该函数
ON_WM_NCPAINTOnNcPaint窗口的非客户端区域需要重绘时调用
ON_WM_NCACTIVATEOnNcActivate窗口的非客户端区域激活或失活时调用
ON_WM_GETDLGCODEOnGetDlgCode调用以处理arrow-key和Tab-key输入
ON_WM_NCMOUSEMOVEOnNcMouseMove当鼠标移入窗口的非客户端区域时调用
ON_WM_NCMOUSEHOVEROnNcMouseHover当在前一次调用TrackMouseEvent之后的某一段之间(时间在TrackMouseEvent中指定)内鼠标移动到窗口并处于Hover状态时调用该函数
ON_WM_NCMOUSELEAVEOnNcMouseLeave在前一次调用TrackMouseEvent后鼠标从非客户端离开时调用该函数
ON_WM_NCLBUTTONDOWNOnNcLButtonDown用户在窗口的非客户端区域按下鼠标左键调用该函数
ON_WM_NCLBUTTONUPOnNcLButtonUp用户在窗口的非客户端区域释放按下的鼠标左键时调用该函数
ON_WM_NCLBUTTONDBLCLKOnNcLButtonDblClk用户在窗口的非客户端区域双击鼠标左键
ON_WM_NCRBUTTONDOWNOnNcRButtonDown用户在窗口的非客户端区域按下鼠标右键时调用该函数
ON_WM_NCRBUTTONUPOnNcRButtonUp用户在窗口的非客户端区域释放按下的鼠标右键时调用该函数
ON_WM_NCRBUTTONDBLCLKOnNcRButtonDblClk用户在窗口的非客户端区域双击鼠标右键
ON_WM_NCMBUTTONDOWNOnNcMButtonDown用户在窗口的非客户端区域按下鼠标中键调用该函数
ON_WM_NCMBUTTONUPOnNcMButtonUp用户在窗口的非客户端区域释放按下的鼠标中键调用该函数
ON_WM_NCMBUTTONDBLCLKOnNcMButtonDblClk用户在窗口的非客户端区域双击鼠标中键
ON_WM_NCXBUTTONDOWNOnNcXButtonDown某些鼠标左右两侧有按键,响应这些按键按下
ON_WM_NCXBUTTONUPOnNcXButtonUp某些鼠标左右两侧有按键,响应这些按键释放
ON_WM_NCXBUTTONDBLCLKOnNcXButtonDblClk某些鼠标左右两侧有按键,响应这些按键连续按下两次
ON_WM_KEYDOWNOnKeyDown一个非系统按键被按下调用该函数
ON_WM_KEYUPOnKeyUp一个非系统按键被释放调用该函数
ON_WM_HOTKEYOnHotKey用户按下系统范围的热键时调用该函数(ALT/Ctrl/Shift/Win)
ON_WM_CHAROnChar非系统按键按下
ON_WM_UNICHAROnUniChar
ON_WM_DEADCHAROnDeadChar当OnKeyUp函数和OnKeyDown函数被一起调用时调用
ON_WM_SYSKEYDOWNOnSysKeyDown前提是窗口对象有输入焦点,用户按下Alt+其他键会调用该函数
ON_WM_SYSKEYUPOnSysKeyUp前提是窗口对象有输入焦点,Alt键按下,之前按下的那个键释放时调用
ON_WM_SYSCHAROnSysChar
ON_WM_SYSDEADCHAROnSysDeadChar
ON_WM_SYSCOMMANDOnSysCommand
ON_WM_INPUTLANGCHANGEOnInputLangChange应用程序的输入语言改变后,调用该函数topmost窗口会受影响
ON_WM_INPUTLANGCHANGEREQUESTOnInputLangChangeRequest用户选择新的语言时来影响具有焦点的窗口
ON_WM_APPCOMMANDOnAppCommand
ON_WM_INPUTOnRawInput
ON_WM_INPUT_DEVICE_CHANGEOnInputDeviceChange当一个IO设备被增加到系统或从系统中移除时
ON_WM_TCARDOnTCard
ON_WM_TIMEROnTimer定时器
ON_WM_HSCROLLOnHScroll用户点击水平滚动条时调用
ON_WM_HSCROLL_REFLECTHScroll
ON_WM_VSCROLLOnVScroll用户点击垂直滚动条时调用
ON_WM_VSCROLL_REFLECTVScroll
ON_WM_INITMENUOnInitMenu
ON_WM_INITMENUPOPUPOnInitMenuPopup当一个pop-up菜单将要激活时调用
ON_WM_MENUSELECTOnMenuSelect当某个窗口是某个menu中的某项时,当用户选择该项时,该函数会被调用
ON_WM_MENUCHAROnMenuChar菜单项助记符按下
ON_WM_MENURBUTTONUPOnMenuRButtonUp鼠标在菜单的某项上,释放鼠标右键按钮时调用
ON_WM_MENUDRAGOnMenuDrag用户拖动菜单的某一项时(前提是菜单中的项可拖动)
ON_WM_MENUGETOBJECTOnMenuGetObject鼠标从菜单的一个项移动到另一个项时调用
ON_WM_UNINITMENUPOPUPOnUnInitMenuPopup当一个可拖动菜单项的菜单被销毁时调用
ON_WM_NEXTMENUOnNextMenu在menu bar或者系统菜单"<-“或者”->"按下
ON_WM_ENTERIDLEOnEnterIdle告诉应用程序的主窗口的window procedure:模态框或者menu正在进入idle状态
ON_WM_MOUSEMOVEOnMouseMove鼠标移动到该窗口
ON_WM_MOUSEHOVEROnMouseHover鼠标在该窗口上悬停
ON_WM_MOUSELEAVEOnMouseLeave鼠标离开该窗口
ON_WM_MOUSEWHEELOnMouseWheel鼠标滚轮滚动,调用窗口的该函数
ON_WM_MOUSEHWHEELOnMouseHWheel
WM_LBUTTONDOWNOnLButtonDown用户按下鼠标左键
ON_WM_LBUTTONUPOnLButtonUp用户释放鼠标左边
ON_WM_LBUTTONDBLCLKOnLButtonDblClk用户双击鼠标左键
ON_WM_RBUTTONDOWNOnRButtonDown用户按下鼠标右键
ON_WM_RBUTTONUPOnRButtonUp用户释放鼠标右键
ON_WM_RBUTTONDBLCLKOnRButtonDblClk用户双击鼠标右键
ON_WM_MBUTTONDOWNOnMButtonDown用户按下鼠标中键
ON_WM_MBUTTONUPOnMButtonUp用户释放鼠标中键
ON_WM_MBUTTONDBLCLKOnMButtonDblClk用户双击鼠标中键
ON_WM_XBUTTONDOWNOnXButtonDown鼠标左右两侧按键被按下
ON_WM_XBUTTONUPOnXButtonUp鼠标左右两侧按键被释放
ON_WM_XBUTTONDBLCLKOnXButtonDblClk双击鼠标左右两侧按键
ON_WM_PARENTNOTIFYOnParentNotify当一个窗口的子窗口被创建或者销毁时,父窗口的该函数被调用
用户在某个子窗口中点击鼠标按钮,其父窗口的该函数被调用
ON_WM_PARENTNOTIFY_REFLECTParentNotify
ON_WM_NOTIFYFORMATOnNotifyFormat该函数接收WM_NOTIFYFORMAT消息,判断是当前窗口是接受ANSI还是Unicode
ON_WM_MDIACTIVATEOnMDIActivate在MDI窗口体系中,当子窗口被激活和另一个子窗口失活时调用该函数
ON_WM_RENDERFORMATOnRenderFormat
ON_WM_RENDERALLFORMATSOnRenderAllFormats
ON_WM_DESTROYCLIPBOARDOnDestroyClipboard
ON_WM_DESTROYCLIPBOARDOnDrawClipboard
ON_WM_PAINTCLIPBOARDOnPaintClipboard
ON_WM_VSCROLLCLIPBOARDOnVScrollClipboard
ON_WM_CONTEXTMENUOnContextMenu用户在窗口中按下鼠标右键
ON_WM_SIZECLIPBOARDOnSizeClipboard
ON_WM_ASKCBFORMATNAMEOnAskCbFormatName
ON_WM_CHANGECBCHAINOnChangeCbChain
ON_WM_HSCROLLCLIPBOARDOnHScrollClipboard
ON_WM_CLIPBOARDUPDATEOnClipboardUpdate
ON_WM_QUERYNEWPALETTEOnQueryNewPalette
ON_WM_PALETTECHANGEDOnPaletteChanged
ON_WM_PALETTEISCHANGINGOnPaletteIsChanging
ON_WM_DROPFILESOnDropFiles
ON_WM_WINDOWPOSCHANGINGOnWindowPosChanging当一个窗口的大小、位置、z-order即将改变时调用该函数
ON_WM_WINDOWPOSCHANGINGOnWindowPosChanged当一个窗口的大小、位置、z-order已经改变时调用该函数
ON_WM_EXITMENULOOPOnExitMenuLoop
ON_WM_ENTERMENULOOPOnEnterMenuLoop
ON_WM_STYLECHANGEDOnStyleChanged窗口的样式发生改变时调用该函数(造成窗口样式发生改变的函数:SetWindowLong)
ON_WM_STYLECHANGINGOnStyleChanging窗口的样式即将发生改变时调用该函数(造成窗口样式发生改变的函数:SetWindowLong)
ON_WM_SIZINGOnSizing该函数调用时表示用户正在改变窗口大小
ON_WM_MOVINGOnMoving该函数调用时表示用户正在移动窗口位置
ON_WM_ENTERSIZEMOVEOnEnterSizeMoveOnMoving刚开始时调用
ON_WM_EXITSIZEMOVEOnExitSizeMoveOnMoving结束时调用
ON_WM_CAPTURECHANGEDOnCaptureChanged告诉窗口它已经失去了鼠标捕获(比如鼠标点击了一个新的窗口,那么原窗口就失去了鼠标捕获)
ON_WM_DEVICECHANGEOnDeviceChange告诉应用程序或者驱动程序:一个设备的硬件配置发生改变
ON_WM_POWERBROADCASTOnPowerBroadcast电源管理时间发生时调用该函数
ON_WM_USERCHANGEDOnUserChanged当用户登录登出时告诉所有窗口调用该函数
ON_WM_CHANGEUISTATEOnChangeUIState
ON_WM_UPDATEUISTATEOnUpdateUIState
ON_WM_QUERYUISTATEOnQueryUIState
ON_WM_THEMECHANGEDOnThemeChanged
ON_WM_DWMCOMPOSITIONCHANGEDOnCompositionChangedThe framework calls this member function for all top-level windows when the Desktop Window Manager (DWM) composition is enabled or disabled.
ON_WM_DWMNCRENDERINGCHANGEDOnNcRenderingChanged
ON_WM_DWMCOLORIZATIONCOLORCHANGEDOnColorizationColorChanged
ON_WM_DWMWINDOWMAXIMIZEDCHANGEOnWindowMaximizedChanged

(* ̄(oo) ̄)注:表格中空白之处为当前所不明白之处。强行翻译,并没有任何意思,翻译了也不知道它说的是什么意思。

参考来源: CWnd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值