友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第39章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




为为验证和更新对话框数据并以结果IDOK关闭对话框,OnCancel的默 

认行为为以结果IDCANCEL关闭对话框并不更机关报所有对话框数据。 

通过重载这些消息处理函数可以改变它们的行为。  



在DoModal返回时,对话框将被关闭,理所当然的,基于该对话框的 

应用程序也应该被关闭,因此在InitInstance的最后使用了语句  



return FALSE;  



            第三节 MFC应用程序的消息循环  



上面的对应用程序的类的定义和声明还包括了MFC的消息循环 


…………………………………………………………Page 178……………………………………………………………

(message   loop),下面我们来详细的描述MFC应用程序的消息循环。 

框架应用程序处理Windows消息的方式同其它Windows应用程序是类似 

的,只不过它提供了一些方法来使得这个过程更加的方便,更加的易 

于维护和更好的包装。  



  l 注意:  



  l 为便于读者理解,在此我们给出一个MFC对对话框控制的支持的树 

   图(如图4。8所示)。  



在类CWinApp的Run成员函数中的消息循环获取各种事件所产生的排队 

消息(queued  message),应用程序消息循环的框架实现是将它们分发 

到合适的窗口。  



在MFC中,每一个单独的消息都由一个专门的函数进行处理,这种称 

作消息处理函数 (message…handler  function或message  handler或 

handler)的专门函数以类的成员函数的方式进行定义。处理命令消息 

的函数还常被称作命令处理函数 (mand handler)。  



Windows应用程序是消息驱动的,因此编写消息处理函数就成了编写 

框架应用程序的工作中的一个很大的组成部分。  



                               



             图4。 8 MFC 中对话框控件类的树状结构图  



每一个有能力获取消息或命令的框架类都有它自己的消息映射 

(message   map),框架使用消息映射来建立消息和命令到它们的处理 

函数之间的链接。所有从类CCmdTarget派生的类都可以有它自己的消 

息映射。尽管我们常常区别消息和命令两个术语,但这里所说的消息 


…………………………………………………………Page 179……………………………………………………………

映射同时对它们进行处理。  



下面我们来看一下消息是如何发送和获取的。  



很多消息来自于用户和程序之间的交互:当用户使用鼠标单击了菜单 

项或工具条按钮或按下了快捷键时,即产生了命令。同样由用户产生 

的Windows消息还可以来 自移动窗口或改变窗口的大小。此外,当程 

序启动或终止、窗口获得或失去焦点等等事件发生时,相应的 

Windows消息也将被发送。控件作为一种特殊形式的窗口,相应的控 

件通知消息也在类似的情形下产生。  



Run成员函数用来获取消息并将它们发送到合适的窗口,很多的命令 

消息被发送到应用程序的主窗口,由类库预先定义的WindowProc函数 

获得这些消息,然后根据所获得的消息的类型来以不同的方式对它们 

进行处理。  



最初接受消息的必须是一个窗口对象。Windows消息通常直接由该窗 

口对象进行处理。而命令消息一般由应用程序的主框架窗口开始,按 

照命令路径描述的命令目标链进行处理。  



当一个命令目标链获得消息或命令时,它将搜索它的消息映射以寻找 

匹配项。如果该消息的一个处理函数存在,该处理函数将被调用。  



与命令不同,对于标准Windows消息,它们并不经过命令目标链,通 

常由该消息的目标窗口进行处理,这个 目标窗口可能是主框架窗口, 

也可能是一个MDI子窗口、一个标准控件、对话框、视或其它形式的 

子窗口。  



在运行时,每一个Windows窗口都与一个窗口对象建立关联,该窗口 

对象由直接的或间接的由类CWnd派生,并且有着它自己的消息映射和 

处理函数。框架使用这个消息映射来将到来的消息映射到它们的处理 

函数。  



对于命令,我们所需做的只是建立命令到它们的处理函数之间的链 

接,通常使用ClassWizard来完成这一步工作,然后编写绝大多数的 

命令处理程序。  



Windows消息通常发送到主框架窗口,但是命令消息将可能传送到其 

它的对象,框架通过一个命令目标对象的标准顺序来传递命令,这些 

命令目标对象至少有一个可能 (并不是一定)包含该命令的处理函数。 

每一个命令目标对象检查它的消息映射以查看是否有一个命令处理函 

数来处理到来的消息。  


…………………………………………………………Page 180……………………………………………………………

不同的命令目标类在不同的时候检查它们 自己的消息映射。典型的, 

一个类将命令传送给其它一些类,这使得这些类具有最先处理该消息 

的机会。如果这些类中没有一个处理了该命令,最初的那个类将检查 

它的消息映射,然后,如果它也没有提供相应的处理函数,它可能会 

将该命令传送给更多的命令目标。表4。2描述了构成这一顺序的结 

构。通常的顺序是先传送给当前激活子命令目标对象,再传送给自 

身,最后传送给其它的命令目标。  



                    表4。 2 标准命令传送路径  



              该类型的对象获     它将按下面的顺序给自 

              取某一命令       身和其它命令目标对象 

              时……         处理该命令的机会  



              MDI框架窗口     1。       当前激活 

               (CMDIFrameWnd)   CMDIChildWnd  

                          2。 当前框架窗口自身  

                          3。  应用程序 (CWinApp对 

                          象)  



              文档框架窗口      1。 当前激活视  

               (CframeWnd, 2。 当前框架窗口  

              CMDIChildWnd)  3。  应用程序 (CWinApp对 

                          象)  



              视           1。 当前视  

                          2。 与视相关联的文档  



              文档          1。 当前文档  

                          2。  与文档相关联的文档 

                          模板  



              对话框         1。 当前对话框  

                          2。  拥有当前对话框的窗 

                          口  

                          3。  应用程序 (CWinApp对 

                          象)  



上面的过程看起来很复杂,并且添加了程序的开销,但是相比处理程 

序对命令的响应来说,传送命令的开销要小得多,因为仅当用户与一 

个用户界面对象进行交互时框架才生成相应的命令。  



当使用AppWizard创建新的框架应用程序 (skeleton            application) 

时,AppWizard就已经为它所创建的每一个命令目标类编写了相应的 

消息映射。在这些消息映射中,有一些已经添加了对某些消息和预定 

义命令的处理,而其它一些只是为了下一步添加处理函数的占位符。  


…………………………………………………………Page 181……………………………………………………………

类的消息映射位于该类的。CPP文件中,我们通常使用ClassWizard为 

每一个类将要处理的消息和命令添加入口。一个典型的消息映射具有 

如下的结构,它来自文件DialogDemo。cpp :  



BEGIN_MESSAGE_MAP(CDialogDemoApp; CWinApp)  



//{{AFX_MSG_MAP(CDialogDemoApp)  



// 注意 ClassWizard 将在此添加或删除映射宏。  



// 不要删除你在这里看到的这些生成代码块 !  



//}}AFX_MSG  



ON_MAND(ID_HELP; CWinApp::OnHelp)  



END_MESSAGE_MAP()  



上面的消息映射包括一系列的宏。消息映射位于�
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!