




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章 应用程序的退出一个Windows应用程序启动之后,一般是进入消息循环,等待或者处理用户的输入,直到用户关闭应用程序窗口,退出应用程序为止。例如,用户按主窗口的关闭按钮,或者选择执行系统菜单“关闭”,或者从“文件”菜单选择执行“退出”,都会导致主窗口被关闭。当用户从“文件”菜单选择执行“退出”时,将发送MFC标准命令消息ID_APP_EXIT。MFC实现了函数CWinApp:OnAppExit()来完成对该命令消息的缺省处理。void CWinApp:OnAppExit()/ same as double-clicking on main window close boxASSERT(m_pMainWnd != NULL);m_pMainWnd-SendMessage(WM_CLOSE);可以看出,其实现是向主窗口发送WM_CLOSE消息。主窗口处理完WM_CLOSE消息之后,关闭窗口,发送WM_QUIT消息,退出消息循环(见图5-3),进而退出整个应用程序。7.1 边框窗口对WM_CLOSE的处理MFC提供了函数CFrameWnd:OnClose来处理各类边框窗口的关闭:不仅包括SDI的边框窗口(从CFrameWnd派生),而且包括MDI的主边框窗口(从CMDIFrameWnd派生)或者文档边框窗口(从CMDIChildWnd派生)的关闭。该函数的原型如下,流程如图6-1所示:void CFrameWnd:OnClose()从图6-1中可以看出,它首先判断是否可以关闭窗口(m_lpfnCloseProc是函数指针类型的成员变量,用于打印预览等情况下),然后,根据具体情况进行处理:l 如果是主窗口被关闭,则关闭程序的所有文档,销毁所有窗口,退出程序;l 如果不是主窗口被关闭,则是文档边框窗口被关闭,又分两种情况:若该窗口所显示的文档被且仅被该窗口显示,则关闭文档和文档窗口并销毁窗口;若该窗口显示的文档还被其他文档边框窗口所显示,则仅仅关闭和销毁文档窗口。下面是处理WM_CLOSE消息中涉及的一些函数。l BOOL CDocument:SaveModified()该虚拟函数的缺省实现:首先调用IsModifed判断文档是否被修改,没有修改就返回,否则继续。当询问用户是否保存被修改的文档时,若用户表示“cancel”,返回FALSE;若用户表示“no”,则返回TRUE;若用户表示“yes”,则存盘失败返回FALSE,存盘成功返回TRUE。存盘处理首先要得到被保存文件的名称,然后调用虚拟函数OnSaveDocument完成存盘工作,并使用SetModifidFlag(FALSE)设置文档为没有修改。l BOOL CDocument:OnSaveDocument(LPCTSTR lpszPathName)该函数是虚拟函数,用来保存文件。其实现的功能和OpOpenDocument相反,但处理流程类似,描述如下:根据lpszPathName打开文件pFile;使用pFile构造一个用于写入数据的CArchive对象,此对象用来保存数据到文件;设置鼠标为时间瓶形状;使用Serialize函数完成序列化写;完毕,恢复鼠标的形状。l CWinApp:SaveAllModified()CWinApp:CloseAllDocuments(BOOL bEndSession)这两个函数都遍历模板管理器列表,并分别对列表中的模板管理器对象逐个调用CDocManager的同名成员函数:CDocManager:SaveAllModified()CDocManager:CloseAllDocuments(BOOL bEndSession)这两个函数都遍历其文档模板列表,并分别对列表中的模板对象逐个调用CDocTemplate的同名成员函数:CDocTemplate:SaveAllModified()CDocTemplate:CloseAllDocuments(BOOL bEndSession)这两个函数都遍历其文档列表,并分别对列表中的文档对象逐个调用CDocuemnt的成员函数:CDocument:SaveModified()CDocument:OnCloseDocument()l CDocument:SaveModified()CDocument:OnCloseDocument()CDocument:SaveModified前面已作了解释。OnCloseDocument是一个虚拟函数,其流程如图6-2所示。通过文档对象所对应的视,得到所有显示该文档的边框窗口的指针:在SDI程序关闭窗口时,获取的是主边框窗口;在MDI程序关闭窗口时,获取的是MDI子窗口。然后,关闭并销毁对应的边框窗口。如果文档对象的m_bAutoDelete为真,则销毁文档对象自身。7.2 窗口的销毁过程7.2.1 DestroyWindow从图6-1、图6-2可以看出,销毁窗口是通过调用DestroyWindow来完成的。DestroyWindow是CWnd类的一个虚拟函数。CWnd实现了该函数,而CMDIChildWnd覆盖了该函数。(1)CWnd:DestroyWindow()主要就是调用:DestroyWindow销毁m_hWnd(必须非空),同时销毁其菜单、定时器,以及完成其他清理工作。:DestroyWindow使将被销毁的窗口失去激活、失去输入焦点,并发送WM_DESTROY、WM_NCDESTROY消息到该窗口及其各级子窗口。如果被销毁的窗口是子窗口且没有设置WM_NOPARENTNOTFIY风格,则给其父窗口发送WM_PARENTNOFITY消息。(2)CMDIChildWnd:DestroyWindow()因为MDI子窗口不能使用:DestroyWindows来销毁,所以CMdiChildWnd覆盖了该函数,CMDIChildWnd主要是调用成员函数MDIDestroy给客户窗口(父窗口)发送消息WM_MDIDESTROY,让客户窗口来销毁自己。7.2.2 处理WM_DESTROY消息消息处理函数OnDestroy处理WM_DESTROY消息,CFrameWnd、CMDIChildWnd、CWnd、CView及其派生类(如CEditView等等)、CControlBar等都提供了对该消息的处理函数。这里,主要解释边框、文档边框、视类的消息处理函数OnDestroy。(1) CWnd:OnDestroy()调用缺省处理函数Default()。(2) CFrameWnd:OnDestroy()首先,销毁工具栏的窗口;然后,设置菜单为缺省菜单;接着,如果要销毁的是主边框窗口,则通知HELP程序本应用程序将退出,没有其他程序使用WINHELP则关闭WINHELP;最后调用CWnd:OnDestroy。(3) CMDIFrameWnd:OnDestroy()首先,调整客户窗口的边界类型;然后,调用基类CframeWnd的OnDestroy。这时,MDI子窗口的工具栏窗口列表为空,故没有工具栏窗口可以销毁。(4) CView:OnDestroy()首先,判断自身是否是边框窗口的活动视,如果是则调用边框窗口的SetActivateView使自己失去激活;然后,调用基类CWnd的OnDestroy。7.2.3 处理WM_NCDESTROY消息窗口的非客户区被销毁时,窗口接收WM_NCDESTROY消息,由OnNcDestroy处理WM_NCDESTROY消息。在MFC中,OnNcDestroy是Windows窗口被销毁时调用的最后一个成员函数。CWnd、CView的某些派生类提供了对该消息的处理函数,这里只讨论CWnd的实现。(1) CWnd:OnNcDestroy()首先判断当前线程的主窗口是否是该窗口,如果是且模块非DLL,则发送WM_QUIT消息,使得程序结束;然后,判断当前线程的活动窗口是否是该窗口,如果是则设置活动窗口为NULL;接着,清理Tooltip窗口,调用Default由Windows缺省处理WM_NCDESTROY消息,UNSUBCLASS,把窗口句柄和MFC窗口对象分离(Detach);最后,调用虚拟函数PostNcDestoy。(2) PostNcDestoyCWnd、CFrameWnd、CView、CControlBar等都覆盖了该函数。文档边框窗口和边框窗口都使用CFrameWnd:PostNcDestroy。l CWnd:PostNcDestroy()MFC缺省实现空l void CFrameWnd:PostNcDestroy()调用delete this销毁自身这个MFC对象。l void CView:PostNcDestroy()调用delete this销毁自身这个MFC对象。(3) 析构函数delete this导致析构函数的调用。需要提到的是CFrameWnd和CView的析构函数。l CFrameWnd:CFrameWnd()边框窗口在创建时,把自身加入到模块-线程状态的边框窗口列表m_frameList中。现在,从列表中移走该窗口对象。必要的话,删除m_phWndDisable数组。l CView:CView()在视创建时,把自身加入到文档对象的视列表中。现在,从列表中移走该视对象。应用程序调用CloseAllDocument关闭文档时。参数为FALSE,它实际上并没有把视从列表中清除,而最后的清除是由析构函数来完成的。至此,边框窗口关闭的过程讨论完毕。下面,结合具体情况SDI窗口的关闭、MDI主窗口的关闭、MDI子窗口的关闭描述对WM_CLOSE消息的处理。7.3 SDI窗口、MDI主、子窗口的关闭参考图6-1分析SDI窗口、MDI主、子窗口的关闭流程。(1) SDI窗口的关闭在这种情况下,主窗口将被关闭。首先,关闭应用程序的文档对象。文档对象的虚拟函数OnCloseDocument调用时销毁了主窗口(Windows窗口和MFC窗口对象),同时也导致视、工具条窗口的销毁。主窗口销毁后,应用程序的主窗口对象为空,故发送WM_QUIT消息结束程序。(2) MDI主窗口的关闭首先,关闭应用程序的所有文档对象。文档对象的OnCloseDocument函数关闭文档时,将销毁文档对象对应的文档边框窗口和它的视窗口。这样,所有的MDI子窗口(包括其子窗口视)被销毁,但应用程序的主窗口还在。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老年人才专业知识培训内容课件
- 实验题力(五)-2023年中考物理重难点专项突破(原卷版)
- 统编版高三历史二轮复习专练:古代的生产工具与劳作(解析版)
- 红烧排骨要煮多久
- 高中二年级英语《Unit 5 Working the Land Reading and Thinking》
- 老年人养生食谱知识培训课件
- 四川省泸州市合江县2024-2025学年七年级下学期期末模拟考试 道德与法治试题(含答案)
- 老年人健康生活知识培训课件
- 酸奶商品知识培训课件
- 人教版英语八年级上册复习:短文填空(裸空型)必考点及专练
- 第2课《树立科学的世界观》第1框《世界的物质性》-【中职专用】《哲学与人生》同步课堂课件
- (正式版)JBT 9229-2024 剪叉式升降工作平台
- 沃特玛通信基站用铁锂电池
- CPK 生成数据工具
- 建设项目安全设施“三同时”(直接使用版)课件
- 媒介文化与休闲异化
- 股权融资合作协议fa财务顾问协议
- 婚姻家庭咨询师(三级)电子教材
- 高一数学开学第一课(纯课件版)
- 有机硅化学课件-有机硅化学概述
- 《建筑供配电与照明》课程教案
评论
0/150
提交评论