与传统的DOS不同,WINDOWS采用的是基于消息的时间驱动形式。当应用程序开始执行时,Windows为该程序创建一个“消息队列(message queue)”,用以存放发给该程序可能创建的各种不用窗口的消息,消息结构为:
typedef struct tagMSG { // msg HWND hwnd;//用以标识接受消息的窗口的窗口句柄 UINT message;//消息标识号 WPARAM wParam;//消息参数 LPARAM lParam;//消息参数 DWORD time;//邮寄消息的时间 POINT pt;//在屏幕坐标下坐标位置 } MSG;
Windows地宫了GetMessage、PostMessage、SeekMessge这样的获得消息、发送消息、查找消息的函数,用来处理不同消息来实现程序的目标。一条消息一条消息的处理很繁琐,为了提高效率,MFC将这些消息及函数封装起来,这就出现了消息映射表和消息映射宏这样的概念。
消息映射表:
例如,用户在按下鼠标左键时,Windows会发出WM_LBUTTONDOWN消息。MFC提供了一种消息映射机制将用户单击左键发出的WM_LBUTTONDOWN消息和一个函数联系在一起。具体代码为:
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);//语句的位置在头文件消息声明宏(DECLARE_MESSAGE_MAP)内
ON_WM_LBUTTONDOWN();//语句的位置在实现文件的消息宏(BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP之间)内
通过上面两行代码已经建立了消息的映射,用户所要实现功能的代码只要加入到下面这个函数内即可:
void CDlg::OnLuttonDown(UINT nFlags,CPoint point){
//添加代码
//CDlg::OnLuttonDown(nFlags,point);
}
MFC中每一个消息都对应一个函数,这样一对一的关系罗列出来就是一个表,如果开发人员需要处理某条消息,只要在消息对应的处理函数中写入代码即可。
消息映射表在MFC中主要是通过三个宏来实现的。这三个宏是DECLARE_MESSAGE_MAP消息的声明宏、BEGIN_MESSAGE_MAP宏、END_MESSAGE_MAP宏。
消息映射宏:
消息映射宏主要有命令消息映射宏、控件窗体消息映射宏、普通窗口消息映射宏、用户自定义消息映射宏。
消息映射宏中有带有COMMAND字样的都是用来处理命令消息的。命令消息主要是通过单击菜单及单击按钮产生的。命令消息在CCmdTarget类是没有处理函数的,也就是说不再消息映射表内。菜单项和按钮还有其他一些控件都有子埃及的ID值,命令消息映射宏主要就是将菜单、按钮和其他一些控件的ID和处理函数映射起来。命令消息的添加也是通过MFC的ClassWizard来完的。
在映射宏中有几个是带REFLECT字样的,这些都是用来处理反射消息的映射宏。反射消息是指子控件向父控件发送消息,而父控件并不处理该消息,而是把消息返回给子控件,让子控件处理这个消息,这就形成了一去一回的反射过程。反射消息主要是在CladdWizard想到的MessageMap选项卡中,Mesage栏里一些前面带“=”的消息。