Windows程序设计教程 第2版 教学课件 ppt 作者 王秀梅 第7章-消息

上传人:E**** 文档编号:89400632 上传时间:2019-05-24 格式:PPT 页数:58 大小:1.25MB
返回 下载 相关 举报
Windows程序设计教程 第2版  教学课件 ppt 作者  王秀梅 第7章-消息_第1页
第1页 / 共58页
Windows程序设计教程 第2版  教学课件 ppt 作者  王秀梅 第7章-消息_第2页
第2页 / 共58页
Windows程序设计教程 第2版  教学课件 ppt 作者  王秀梅 第7章-消息_第3页
第3页 / 共58页
Windows程序设计教程 第2版  教学课件 ppt 作者  王秀梅 第7章-消息_第4页
第4页 / 共58页
Windows程序设计教程 第2版  教学课件 ppt 作者  王秀梅 第7章-消息_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《Windows程序设计教程 第2版 教学课件 ppt 作者 王秀梅 第7章-消息》由会员分享,可在线阅读,更多相关《Windows程序设计教程 第2版 教学课件 ppt 作者 王秀梅 第7章-消息(58页珍藏版)》请在金锄头文库上搜索。

1、,Windows是一个消息驱动的操作系统。 所谓消息,是指应用程序与操作系统交互的手段。 用户输入由Windows以消息的形式发送给应用程序的窗口。 该窗口通过窗口过程来接收和处理消息,然后再把控制返还给Windows。 本章将详细介绍Windows中的消息处理机制。,7.1 Windows消息,对于Windows应用程序而言,消息是其动作的动力源泉。 Windows应用程序可以接受各种消息,包括键盘、鼠标等。 从不同的角度划分,消息分为不同的种类。 在了解消息分类之前,首先介绍一下消息的具体结构。,7.1.1 消息结构,Windows通过监视各种输入设备把发生的事件转化为消息,并将消息保存在

2、消息队列中。,在Windows中,消息结构的原型如下所示: typedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG;,7.1.2 消息分类,1消息的发送途径 (1)队列消息 Windows为当前运行的每个Windows程序维护一个消息队列。 队列消息是指由Windows放入程序的消息队列中,然后由应用程序取出并发送的消息。,队列消息又可以分为系统消息队列和线程消息队列。,(2)非队列消息,非队列消息是指在Windows调用窗口时直接传送给窗口过程

3、的消息。,2消息的来源,(1)系统消息 系统消息是一些预定义的UINT常量值。 (2)自定义消息 用户可以为了特定的目的而定义自己的消息,这些消息被称为自定义消息。,3消息的处理方式,(1)窗口消息 窗口消息一般与创建窗口、绘制窗口、移动窗口和销毁窗口等操作有关。, WM_CHAR WM_CREATE WM_PAINT WM_LBUTTONDOWM WM_MOUSEMOVE WM_CLOSE WM_DESTROY,(2)命令消息,命令消息一般与处理用户的某个请求或执行用户的某个命令有关。,(3)控件通知消息,普通的控件都是子窗口,因为其都继承自CWnd类。 它们通过向其父窗口(一般为对话框)发

4、送消息,响应用户的动作(如移动鼠标、单击等)。,7.2 消息的传输,通过上面的介绍,读者已经了解了消息的基本知识。 本节将具体介绍消息是如何在应用程序与窗口之间或是窗口与窗口之间进行传输的。,7.2.1 消息的寄送,消息的传输分为消息的寄送和发送两种。 寄送一个消息时,把消息发送到拥有那个窗口的应用程序的消息队列中。 当应用发现自己有空闲时,它就搜索消息队列,并在消息队列中处理消息,即从队列中删除它们,并将它们发送到指定的窗口。,用MFC寄送一个消息的方法是:首先获取接收消息的CWnd类对象的指针;然后,调用CWnd的成员函数PostMessage()。 如前所述,该函数寄送消息即刻返回,其返

5、回值放在Res中,它仅标志寄送成功与否: LRESULT Res=pWnd-PostMessage(UINT Msg,WPARAM wParam,LPARAM lParam);,7.2.2 消息的发送,发送一个消息时,消息不进入目标窗口的消息队列。 本质上与直接调用窗口处理过程一样,就好像它是另一个函数,所以通信是即时的。 直到窗口过程为调用函数返回一个结果后,应用程序才能继续运行。,其具体的调用方式与寄送消息时类似,然而消息发送是调用SendMessage()而不是PostMessage()函数。 另外,返回结果也不太一样,它返回的是由目标窗口的窗口过程处理而得到的结果,这里不再赘述。,7.

6、3 消 息 处 理,消息在经过传输后,需要对消息进行处理。 此时要为消息添加相应的消息响应函数。 本节将具体介绍消息的处理机制。,7.3.1 消息响应,在应用程序的运行过程中,当用户按下键盘或是鼠标时,操作系统会立即感应这一事件并做出判断。 分辨出用户按下的是键盘还是鼠标,并分辨出按下的是鼠标的哪个按键或是键盘上的哪个按键。,然后操作系统将获取到的事件递交到应用程序,由应用程序决定对这一事件该做出何种反应。 上述对事件的反应过程就是所谓的消息响应。,在Windows中,消息被封装在一个MSG结构体中。 MSG结构的原型如下: typedef struct tagMSG HWND hWnd; U

7、INT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG;,7.3.2 消息映射,在MFC中,消息映射是如何实现的。下面对此进行详细讲述。 在MFC中,通过使用ClassWizard来实现消息映射。 首先使用ClassWizard在源码中添加一些消息映射的内容,然后声明并实现消息处理函数。 消息映射的实现过程具体包括以下两个方面。,1在类的定义中声明消息映射宏,在类的定义(头文件)里,使用ClassWizard增加了消息处理函数声明,并添加一行声明消息映射的宏DECLARE_MESSAGE_MAP。,2在类的实现中

8、实现消息处理函数,在类的实现里,实现消息处理函数,并使用IMPLEMENT_MESSAGE_MAP宏实现消息映射。 一般情况下,这些声明和实现由MFC的ClassWizard自动进行维护。,7.3.3 消息响应函数,通过消息映射,应用程序找到的只是该消息所对应的响应函数的入口。 而要实现消息的响应处理,则还需要定义该消息的响应函数。 在类中,消息响应函数都是类的成员函数。,添加消息响应函数包括两个方面。 下面以程序sample0701为例进行介绍。,1在类的定义中添加该消息响应函数的函数声明,消息响应函数的一般形式是以afx_msg开头,代码如下: class CSample0701App :

9、 public CWinApp public: afx_msg void OnAppAbout(); /消息响应函数的声明 ;,2在类的实现中添加该消息响应函数 的函数体,在声明消息响应函数之后,要为其添加相应的消息响应函数的函数体,代码如下: void CSample0701App:OnAppAbout() /消息响应函数的函数体 CAboutDlg aboutDlg; aboutDlg.DoModal(); ,7.3.4 添加消息响应函数,如果在类中添加消息响应函数,方法一般有以下3种: (1)在MFC类向导(MFC ClassWizard)中添加; (2)在类视图(ClassView)选

10、项卡中添加; (3)在类的头文件和实现文件中手动添加。,1在类向导中添加,图7.1 【MFC ClassWizard】对话框,图7.2 程序sample0702的运行结果,2在类视图中添加,图7.3 弹出式菜单,图7.4 【New Windows Message and Event Handlers for class CSample0702View】对话框,图7.5 程序sample0702的运行结果,3在类头文件和实现文件中添加,图7.6 程序sample0703的运行结果,7.4 自定义消息,在编写Windows应用程序的过程中,用户不仅可以使用系统定义好的消息,也可以自己定义消息。 用

11、户自己定义的消息称为自定义消息。 本节将对自定义消息的使用进行详细介绍。,7.4.1 自定义消息的基本步骤,在Windows中,系统定义的消息都对应着一个固定的整数值。 Windows保留了0WM_USER的消息。 而Windows允许用户把自定义窗口消息映射为范围在WM_USER+1 0x7ff的数值。,(1)在类文件中定义消息,通常情况下,自定义消息的格式如下: #define WM_MYMSG (WM_USER+100) 其中,WM_MYMSG是自定义消息的消息标识。 该标识可以是以“WM_”开头的其他任何标识符。,(2)在类中声明消息响应函数,在类的定义中声明消息响应函数,代码如下:

12、class CMainFrame : public CFrameWnd protected: /AFX_MSG(CMainFrame) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg int OnMyMsg(WPARAM wParam,LPARAM lParam); /声明消息响应函数 /AFX_MSG DECLARE_MESSAGE_MAP() ;,(3)实现消息响应函数,自定义消息响应函数OnMyMsg()的实现,代码如下: int CMainFrame:OnMyMsg(WPARAM wParam,LPARAM lP

13、aram) / /函数的具体操作 return 0; ,(4)添加消息映射,在类的.cpp文件中添加消息映射,代码如下: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) /AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() /添加消息映射 ON_MESSAGE(WM_MYMSG,OnMyMsg) /AFX_MSG_MAP END_MESSAGE_MAP(),7.4.2 自定义消息应用,本示例演示了一个加法运算。 将对话框中数字的计算结果输出到文档界面上。,图7.7 弹出式菜单,图7.8 【Insert Resource】对话框,图7.

14、9 设计对话框资源,图7.10 添加对话框类,图7.11 程序sample0704的运行结果,小 结,本章主要介绍了Windows的消息处理机制。 通过本章的学习,读者可以掌握Windows的消息机制、消息的传输、系统消息的处理和自定义消息。 其中,自定义消息是一个难于掌握的知识点,需读者仔细分析体会。,其实对于本章的内容,是需要读者深入体会才能熟练应用的。 下一章将向读者介绍有关菜单、键盘和鼠标的相关知识。,上机指导,实验一:查看消息映射 实验内容 创建一个单文档的应用程序TestOne,找到有关消息映射的代码。,实验目的 掌握什么是消息映射,了解在应用程序内部消息映射的过程。 实现思路 在

15、7.3.2节中介绍了如何消息映射的过程。 在此读者根据7.3.2节的内容,熟悉消息映射的过程。,实验二:添加消息响应函数 实验内容 创建一个基于单文档的应用程序TestTwo,然后使用类向导添加鼠标右键单击的消息响应函数。 运行结果如图7.12所示。,图7.12 实验二的运行结果,实验目的 熟悉使用类向导为鼠标消息添加消息响应函数。 实现思路 在7.3.4节介绍了添加消息响应函数的过程。 在此,只需要知道鼠标右键单击产生的消息为WM_ RBUTTONDOWN即可。,实验三:添加自定义消息 实验内容 创建一个基于单文档的应用程序TestThree,然后使用自定义一条消息,并添加该消息的响应函数。 该消息响应函数用于将输入的两个字符串进行合并,并显示在客户区。 运行结果如图7.13所示。,图7.13 实验三的运行结果,实验目的 熟悉添加自定义消息的具体步骤,并能够灵活使用标准控件。 实现思路 创建一个基于单文档的应用程序,并为该应用程序添加一个对话框资源;通过添加的自定义消息,将输入的字符串传递到文档类,然后将接收的字符串进行连接。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号