MFC消息映射详解(整理转载)

MFC中的消息映射机制将消息与处理函数关联,简化了Windows消息的处理。消息包括用户操作产生的消息和系统内部消息,处理函数通常为类的成员函数。消息映射通过DECLARE_MESSAGE_MAP、BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏实现,消息映射宏分为命令消息、控件窗体消息等多种类型。消息主要分为窗口管理、初始化、输入等类型,常用消息如WM_LBUTTONDOWN、WM_KEYDOWN等。处理函数如OnLButtonDown、OnPaint等,命令消息处理函数无参数且无返回值。
摘要由CSDN通过智能技术生成

消息:主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息。例如,单击鼠标左按钮,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提供了GetMessagePostMessageSeekMessge这样的获得消息、发送消息、查找消息的函数,用来处理不同消息来实现程序的目标。一条消息一条消息的处理很繁琐,为了提高效率,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和处理函数映射起来。命令消息的添加也是通过MFCClassWizard

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值