教科书和网上讲MFC大多是基于VC++6.0,这里讲一下VS2010的MFC的消息函数的添加。
VS 2010的MFC的类向导如下(通过项目-->类向导打开):
一、消息响应函数的添加(以单文档应用程序的菜单项点击事件为例):
1.确定响应函数属于哪个类,这里属于CAppView类。
2.找到对象ID,这里是我们添加的菜单项的ID。
3.选择何种响应消息,这里菜单项的响应消息应为WM_COMMAND消息。UPDATE_COMMAND_UI是界面需要重绘时由系统发送。
4.添加消息处理函数,点击“添加处理程序”即可。
5.编辑处理代码。
注:
若要删除添加的消息处理函数,直接在类向导中找到它并点击删除即可,这样相应的代码就被注释了。类向导添加消息处理函数其实做了三件事:
1.在处理消息的类.h文件中声明消息处理函数,如:
afx_msg void On_Point();
2.在该类的CPP文件中编辑实现代码;
3.建立映射。
即 建立消息和消息函数的对应关系,在类的.h文件中,有DECLARE_MESSAGE_MAP()的宏,它声明这个类含有消息映射。然后在类的.CPP文件中有
BEGIN_MESSAGE_MAP()
ON_COMMAND(ID_FILE_PRINT,&CView::OnFilePrint)
ON_MESSAGE(WM_MY_MESSAGE,&CMyAppView::OnMyMessage)
.................
END_MESSAGE_MAP()
在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间就进行了消息和消息处理函数的对应关系的建立,根据消息的类型,左边是消息的ID或者控件的ID,右边均为处理函数。ON_COMMAND(命令消息),ON_MESSAGE(可用于自定义消息)表示不同的消息类型。
所以,我们也可以通过手工加入东西来进行消息函数的添加,这跟用类向导添加是一样的。
若是自定义消息则之前还需要有以下步骤:
1.定义消息,如:
#define WM_MYMESSAGE (WM_USER+101)
这里WM_USER也是一个宏,其实就是一个数字而已,这样的定义方法是为了防止消息值重复。
2.何时发送消息,如果是系统定义好了的消息,它会在合适的时候发送消息给处理函数,而用户自定义的消息则需要自己定义何时发送。
发送消息有两个函数:
sendmessage() postmessage()
前者将消息发送给窗口处理函数,直到发送的消息被处理后才返回。后者直接将消息发送到消息处理队列就返回。
用法:
sendmessage(WM_MYMESSAGE);