消息:主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息。例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息,按下键盘上的字母键,将产生WM_CHAR消息。
消息处理:在MFC中,每个专门的处理函数单独处理每个消息。消息处理函数通常是某一类的成员函数,编写消息处理函数是编写框架应用程序的主要任务。可以使用ClassWizard创建消息处事函数,然后从Classwizard直接跳到源文件消息处理函数,编写处理代码。
消息映射:可以接收消息和命令的所有框架类都有自已的消息映射。框架利用消息映射把消息、命令与它们的处理函数链接起来。从CCmdTarget类派生的任何类都可以有消息映射。虽然叫作“消息映射”,但消息映射既可以处理消息,也可以处理命令。
与传统的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