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

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

举报
开通vip

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

Windows程序设计教程 第2版  教学课件 ppt 作者  王秀梅 第7章-消息
Windows是一个消息驱动的操作系统。 所谓消息,是指应用程序与操作系统交互的手段。 用户输入由Windows以消息的形式发送给应用程序的窗口。 该窗口通过窗口过程来接收和处理消息,然后再把控制返还给Windows。 本章将详细介绍Windows中的消息处理机制。7.1Windows消息 对于Windows应用程序而言,消息是其动作的动力源泉。 Windows应用程序可以接受各种消息,包括键盘、鼠标等。 从不同的角度划分,消息分为不同的种类。 在了解消息分类之前,首先介绍一下消息的具体结构。7.1.1消息结构 Windows通过监视各种输入设备把发生的事件转化为消息,并将消息保存在消息队列中。 在Windows中,消息结构的原型如下所示: typedefstructtagMSG{ HWNDhwnd; UINTmessage; WPARAMwParam; LPARAMlParam; DWORDtime; POINTpt; }MSG;7.1.2消息分类 1.消息的发送途径 (1)队列消息 Windows为当前运行的每个Windows程序维护一个消息队列。 队列消息是指由Windows放入程序的消息队列中,然后由应用程序取出并发送的消息。 队列消息又可以分为系统消息队列和线程消息队列。(2)非队列消息 非队列消息是指在Windows调用窗口时直接传送给窗口过程的消息。2.消息的来源 (1)系统消息 系统消息是一些预定义的UINT常量值。 (2)自定义消息 用户可以为了特定的目的而定义自己的消息,这些消息被称为自定义消息。3.消息的处理方式 (1)窗口消息 窗口消息一般与创建窗口、绘制窗口、移动窗口和销毁窗口等操作有关。 ①WM_CHAR ②WM_CREATE ③WM_PAINT ④WM_LBUTTONDOWM ⑤WM_MOUSEMOVE ⑥WM_CLOSE ⑦WM_DESTROY(2)命令消息 命令消息一般与处理用户的某个请求或执行用户的某个命令有关。(3)控件 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 消息 普通的控件都是子窗口,因为其都继承自CWnd类。 它们通过向其父窗口(一般为对话框)发送消息,响应用户的动作(如移动鼠标、单击等)。7.2消息的传输 通过上面的介绍,读者已经了解了消息的基本知识。 本节将具体介绍消息是如何在应用程序与窗口之间或是窗口与窗口之间进行传输的。7.2.1消息的寄送 消息的传输分为消息的寄送和发送两种。 寄送一个消息时,把消息发送到拥有那个窗口的应用程序的消息队列中。 当应用发现自己有空闲时,它就搜索消息队列,并在消息队列中处理消息,即从队列中删除它们,并将它们发送到指定的窗口。 用MFC寄送一个消息的方法是:首先获取接收消息的CWnd类对象的指针;然后,调用CWnd的成员函数PostMessage()。 如前所述,该函数寄送消息即刻返回,其返回值放在Res中,它仅标志寄送成功与否: LRESULTRes=pWnd->PostMessage(UINTMsg,WPARAMwParam,LPARAMlParam);7.2.2消息的发送 发送一个消息时,消息不进入目标窗口的消息队列。 本质上与直接调用窗口处理过程一样,就好像它是另一个函数,所以通信是即时的。 直到窗口过程为调用函数返回一个结果后,应用程序才能继续运行。 其具体的调用方式与寄送消息时类似,然而消息发送是调用SendMessage()而不是PostMessage()函数。 另外,返回结果也不太一样,它返回的是由目标窗口的窗口过程处理而得到的结果,这里不再赘述。7.3消息处理 消息在经过传输后,需要对消息进行处理。 此时要为消息添加相应的消息响应函数。 本节将具体介绍消息的处理机制。7.3.1消息响应 在应用程序的运行过程中,当用户按下键盘或是鼠标时,操作系统会立即感应这一事件并做出判断。 分辨出用户按下的是键盘还是鼠标,并分辨出按下的是鼠标的哪个按键或是键盘上的哪个按键。 然后操作系统将获取到的事件递交到应用程序,由应用程序决定对这一事件该做出何种反应。 上述对事件的反应过程就是所谓的消息响应。 在Windows中,消息被封装在一个MSG结构体中。 MSG结构的原型如下: typedefstructtagMSG{ HWNDhWnd; UINTmessage; WPARAMwParam; LPARAMlParam; DWORDtime; POINTpt; }MSG;7.3.2消息映射 在MFC中,消息映射是如何实现的。下面对此进行详细讲述。 在MFC中,通过使用ClassWizard来实现消息映射。 首先使用ClassWizard在源码中添加一些消息映射的内容,然后声明并实现消息处理函数。 消息映射的实现过程具体包括以下两个方面。1.在类的定义中声明消息映射宏 在类的定义(头文件)里,使用ClassWizard增加了消息处理函数声明,并添加一行声明消息映射的宏DECLARE_MESSAGE_MAP。2.在类的实现中实现消息处理函数 在类的实现里,实现消息处理函数,并使用IMPLEMENT_MESSAGE_MAP宏实现消息映射。 一般情况下,这些声明和实现由MFC的ClassWizard自动进行维护。7.3.3消息响应函数 通过消息映射,应用程序找到的只是该消息所对应的响应函数的入口。 而要实现消息的响应处理,则还需要定义该消息的响应函数。 在类中,消息响应函数都是类的成员函数。 添加消息响应函数包括两个方面。 下面以程序sample0701为例进行介绍。1.在类的定义中添加该消息响应函数的函数声明 消息响应函数的一般形式是以afx_msg开头,代码如下: classCSample0701App:publicCWinApp { public: afx_msgvoidOnAppAbout(); //消息响应函数的声明 };2.在类的实现中添加该消息响应函数的函数体 在声明消息响应函数之后,要为其添加相应的消息响应函数的函数体,代码如下: voidCSample0701App::OnAppAbout() //消息响应函数的函数体 { CAboutDlgaboutDlg; aboutDlg.DoModal(); }7.3.4添加消息响应函数 如果在类中添加消息响应函数,方法一般有以下3种: (1)在MFC类向导(MFCClassWizard)中添加; (2)在类视图(ClassView)选项卡中添加; (3)在类的头文件和实现文件中手动添加。1.在类向导中添加图7.1【MFCClassWizard】对话框图7.2程序sample0702的运行结果2.在类视图中添加图7.3弹出式菜单图7.4【NewWindowsMessageandEventHandlersforclassCSample0702View】对话框图7.5程序sample0702的运行结果3.在类头文件和实现文件中添加图7.6程序sample0703的运行结果7.4自定义消息 在编写Windows应用程序的过程中,用户不仅可以使用系统定义好的消息,也可以自己定义消息。 用户自己定义的消息称为自定义消息。 本节将对自定义消息的使用进行详细介绍。7.4.1自定义消息的基本步骤 在Windows中,系统定义的消息都对应着一个固定的整数值。 Windows保留了0~WM_USER的消息。 而Windows允许用户把自定义窗口消息映射为范围在WM_USER+1~0x7ff的数值。(1)在类文件中定义消息 通常情况下,自定义消息的格式如下: #defineWM_MYMSG(WM_USER+100) 其中,WM_MYMSG是自定义消息的消息标识。 该标识可以是以“WM_”开头的其他任何标识符。(2)在类中声明消息响应函数 在类的定义中声明消息响应函数,代码如下: classCMainFrame:publicCFrameWnd { protected: //{{AFX_MSG(CMainFrame) afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct); afx_msgintOnMyMsg(WPARAMwParam,LPARAMlParam); //声明消息响应函数 //}}AFX_MSG DECLARE_MESSAGE_MAP() };(3)实现消息响应函数 自定义消息响应函数OnMyMsg()的实现,代码如下: intCMainFrame::OnMyMsg(WPARAMwParam,LPARAMlParam) { //… //函数的具体操作 return0; }(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【InsertResource】对话框图7.9设计对话框资源图7.10添加对话框类图7.11程序sample0704的运行结果小  结 本章主要介绍了Windows的消息处理机制。 通过本章的学习,读者可以掌握Windows的消息机制、消息的传输、系统消息的处理和自定义消息。 其中,自定义消息是一个难于掌握的知识点,需读者仔细分析体会。 其实对于本章的内容,是需要读者深入体会才能熟练应用的。 下一章将向读者介绍有关菜单、键盘和鼠标的相关知识。上机指导 实验一:查看消息映射 实验内容 创建一个单文档的应用程序TestOne,找到有关消息映射的代码。 实验目的 掌握什么是消息映射,了解在应用程序内部消息映射的过程。 实现思路 在7.3.2节中介绍了如何消息映射的过程。 在此读者根据7.3.2节的内容,熟悉消息映射的过程。 实验二:添加消息响应函数 实验内容 创建一个基于单文档的应用程序TestTwo,然后使用类向导添加鼠标右键单击的消息响应函数。 运行结果如图7.12所示。图7.12实验二的运行结果 实验目的 熟悉使用类向导为鼠标消息添加消息响应函数。 实现思路 在7.3.4节介绍了添加消息响应函数的过程。 在此,只需要知道鼠标右键单击产生的消息为WM_RBUTTONDOWN即可。 实验三:添加自定义消息 实验内容 创建一个基于单文档的应用程序TestThree,然后使用自定义一条消息,并添加该消息的响应函数。 该消息响应函数用于将输入的两个字符串进行合并,并显示在客户区。 运行结果如图7.13所示。图7.13实验三的运行结果 实验目的 熟悉添加自定义消息的具体步骤,并能够灵活使用标准控件。 实现思路 创建一个基于单文档的应用程序,并为该应用程序添加一个对话框资源;通过添加的自定义消息,将输入的字符串传递到文档类,然后将接收的字符串进行连接。
本文档为【Windows程序设计教程 第2版 教学课件 ppt 作者 王秀梅 第7章-消息】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥12.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
科技制造的艺术美
暂无简介~
格式:ppt
大小:1MB
软件:PowerPoint
页数:0
分类:工学
上传时间:2019-10-31
浏览量:10