在MFC中想要完成消息映射,需要在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP两个宏之间进行消息映射声明才行, 例如:
//开始消息映射的定义(必须用在类实现中)
BEGIN_MESSAGE_MAP(CMyClass, CBase)
...
ON_CONTROL_REFLECT(CBN_DROPDOWN, &CMyClass::OnCbnDropdown)
ON_WM_MOUSEMOVE()
...
//结束消息映射的定义(必须用在类实现中)
END_MESSAGE_MAP()
常见消息映射格式
现在对常见的消息映射格式和声明进行总结如下:
标准消息
标准消息开头是以WM_开始的, 形如WM_CLOSE,对这种消息其格式如下,是否有形参和具体消息有关系。
映射格式:
ON_WM_CLOSE()
函数声明:
afx_msg void OnClose()
命令消息
命令消息是通过WM_COMMAND 形式进行传递的,它可以响应菜单命令,工具栏命令,按钮命令等。
消息映射:
ON_COMMAND(id, memberFxn)
函数声明:
afx_msg void memberFxn()
通告消息
通告消息一般是用户点击控件,控件向父窗口(对话框)发出对应的事件消息,比如CBN_DROPDOWN、BN_CLICKED等;通告消息都具有相同的函数声明,仅消息映射有所区别,下面列举出不同控件的消息映射。
各控件的函数声明:
afx_msg void memberFxn( )
各控件的消息映射:
- 普通控件
ON_CONTROL( <wNotifyCode>,<id>,<memberFxn> )
- 按钮控件
ON_BN_PAINT(<id>, <memberFxn> )
ON_BN_CLICKED(<id>, <memberFxn> )
ON_BN_DISABLE(<id>, <memberFxn> )
ON_BN_HILITE(<id>, <memberFxn> )
ON_BN_UNHILITE(<id>, <memberFxn>)
ON_BN_DOUBLECLICKED(<id>,<memberFxn>)
- 编辑控件
ON_EN_CHANGE(<id>, <memberFxn> )
ON_EN_ERRSPACE(<id>, <memberFxn>)
ON_EN_HSCROLL(<id>, <memberFxn> )
ON_EN_KILLFOCUS(<id>,<memberFxn>)
ON_EN_MAXTEXT(<id>, <memberFxn> )
ON_EN_SETFOCUS(<id>, <memberFxn>)
ON_EN_UPDATE(<id>, <memberFxn> )
ON_EN_VSCROLL(<id>, <memberFxn> )
- 组合框控件
ON_CBN_CLOSEUP(<id>, <memberFxn> )
ON_CBN_DBLCLK(<id>, <memberFxn> )
ON_CBN_DROPDOWN(<id>, <memberFxn> )
ON_CBN_EDITCHANGE(<id>,<memberFxn> )
ON_CBN_EDITUPDATE(<id>,<memberFxn> )
ON_CBN_ERRSPACE(<id>, <memberFxn> )
ON_CBN_KILLFOCUS(<id>, <memberFxn> )
ON_CBN_SELCHANGE(<id>, <memberFxn> )
ON_CBN_SELENDCANCEL(<id>,<memberFx>)
ON_CBN_SELENDOK(<id>, <memberFxn> )
ON_CBN_SETFOCUS(<id>, <memberFxn> )
- 列表框控件
ON_LBN_DBLCLK(<id>, <memberFxn> )
ON_LBN_ERRSPACE(<id>, <memberFxn> )
ON_LBN_KILLFOCUS(<id>, <memberFxn>)
ON_LBN_SELCHANGE(<id>, <memberFxn>)
ON_LBN_SETFOCUS(<id>, <memberFxn> )
状态更新消息
状态更新消息主要应用更新菜单项和工具栏按钮,其消息映射和函数声明如下:
消息映射:
ON_UPDATE_COMMAND_UI(id, memberFxn)
函数声明:
afx_msg void memberFxn(CCmdUI *pCmdUI);
自定义消息
MFC提供了自定义消息的函数映射接口,便于用户定义自己的消息,其函数映射入口和函数声明如下:
消息映射:
ON_MESSAGE(message, memberFxn)
函数声明:
afx_msg LRESULT memberFxn(WPARAM, LPARAM);
消息反射
消息反射是指父窗口在收到控件消息(通告消息,标准消息)后,再传递给子控件本身来处理,父窗口不处理,其格式如下:
对于WM_COMMAND 形式的:
//消息映射:
ON_CONTROL_REFLECT( wNotifyCode, memberFxn )
//函数声明:
afx_msg void memberFxn ( );
对于WM_NOTIFY形式的:
//消息映射:
ON_NOTIFY_REFLECT(wNotifyCode, memberFxn)
//函数声明:
afx_msg void memberFxn (NMHDR * pNotifyStruct, LRESULT* result);
更多信息见Windows控件消息反射
VS2008添加消息映射的方法
步骤1 选中类视图
步骤2 选中继承的控件类->鼠标右键->选择属性
步骤3 属性中点击消息按钮->选择带”=”的消息,如下所示: