第6章 应用程序的退出.pdf
《第6章 应用程序的退出.pdf》由会员分享,可在线阅读,更多相关《第6章 应用程序的退出.pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 6 章 应用程序的退出 第 6 章 应用程序的退出 一个 Windows 应用程序启动之后,一般是进入消息循环,等待或者处理用户的输入,直到用户关闭应用程序窗口,退出应用程序为止。例如,用户按主窗口的关闭按钮,或者选择执行系统菜单“关闭”,或者从“文件”菜单选择执行“退出”,都会导致主窗口被关闭。当用户从“文件”菜单选择执行“退出”时,将发送 MFC 标准命令消息 ID_APP_EXIT。MFC 实现了函数 CWinApp:OnAppExit()来完成对该命令消息的缺省处理。void CWinApp:OnAppExit()/same as double-clicking on main w
2、indow close box ASSERT(m_pMainWnd!=NULL);m_pMainWnd-SendMessage(WM_CLOSE);可以看出,其实现是向主窗口发送 WM_CLOSE 消息。主窗口处理完 WM_CLOSE 消息之后,关闭窗口,发送 WM_QUIT 消息,退出消息循环(见图 5-3),进而退出整个应用程序。6.1 边框窗口对WM_CLOSE的处理 6.1 边框窗口对WM_CLOSE的处理 MFC 提供了函数 CFrameWnd:OnClose 来处理各类边框窗口的关闭:不仅包括 SDI 的边框窗口(从 CFrameWnd 派生),而且包括 MDI 的主边框窗口(从
3、CMDIFrameWnd 派生)或者文档边框窗口(从 CMDIChildWnd 派生)的关闭。该函数的原型如下,流程如图 6-1 所示:void CFrameWnd:OnClose()从图 6-1 中可以看出,它首先判断是否可以关闭窗口(m_lpfnCloseProc 是函数指针类型的成员变量,用于打印预览等情况下),然后,根据具体情况进行处理:?如果是主窗口被关闭,则关闭程序的所有文档,销毁所有窗口,退出程序;?如果不是主窗口被关闭,则是文档边框窗口被关闭,又分两种情况:若该窗口所显示的文档被且仅被该窗口显示,则关闭文档和文档窗口并销毁窗口;若该窗口显示的文档还被其他文档边框窗口所显示,则仅
4、仅关闭和销毁文档窗口。(m_lpfnCloseProc!=NULL&!(*m_lpfnCloseProc)(this)TRUE,则不能关闭窗口,返回,否则,继续 为获取活动文档对象 pDocument GetActiveDocument CFrameWnd的成员函数 GetActiveDocument 虚拟函数 得到活动视 pView GetActivateView 得到活动视的文档pView-GetDocum ent()如 pDocument 非空,询问是否可以关闭该边框窗口;若不能就返回,否则,继续 pDocument-CanCloseFrame CDocument 的CanCloseFr
5、ame个边框窗口显示该文档,回 TRUESaveModified虚 拟 成 员 函 数检查是否多于一是则返,否则调用虚拟函数保存文档 保存所有的文档 pApp-SaveAllModified CWinApp 的虚拟成员SaveAllModified函数关闭文档前隐藏程序的窗口pApp-HideApplication CWinApp 的成员函数HideApplication 关闭程序所有的文档 pApp-CloseAllDocuments CWinApp 的成员函数CloseAllDocuments 若主窗口已经销毁(NULL)且不是 DLL 模块,则发送消息WM_QUIT 后返回,否则继续Y
6、N 应用程序的主窗口是要关闭的该窗口吗?下面是处理 WM_CLOSE 消息中涉及的一些函数。YN关闭文档窗口,然后返回pDocument-OnCloseDocument()通知文档准备关闭窗口 pDocument-PreCloseFrame(this)CDocument 的 虚拟 成 员 函 数OnCloseDocumentCD拟Procument 的 虚成 员 函 数eCloseFrame销毁窗口DestroyWindow()MFC为 类CWnd、CMDIChildWnd实 现DestroyWindow;WM_DESTROY 和 WM或者 WM_QUIT 消息CControlBar、了 虚
7、拟 函 数它将导致_NCDESTROY发送给将销毁的窗口。NY图 6-1 CFrameWnd 的 OnClose 函数活动文档存在且属性自动删除为(pDocument!=NULL&pDocument-m_bAutoDelete)真该边框窗口是否显示活动文档的最后一个边框窗口?BOOL CDocument:SaveModified()该虚拟函数的缺省实现:首先调用 IsModifed 判断文档是否被修改,没有修改就返回,否则继续。当询问用户是否保存被修改的文档时,若用户表示“cancel”,返回 FALSE;若用户表示“no”,则返回 TRUE;若用户表示“yes”,则存盘失败返回 FALSE,
8、存盘成功返回 TRUE。存盘处理首先要得到被保存文件的名称,然后调用虚拟函数 OnSaveDocument 完成存盘工作,并使用 SetModifidFlag(FALSE)设置文档为没有修改。?BOOL CDocument:OnSaveDocument(LPCTSTR lpszPathName)该函数是虚拟函数,用来保存文件。其实现的功能和 OpOpenDocument 相反,但处理流程类似,描述如下:根据 lpszPathName 打开文件 pFile;使用 pFile 构造一个用于写入数据的 CArchive 对象,此对象用来保存数据到文件;设置鼠标为时间瓶形状;使用 Serialize
9、函数完成序列化写;完毕,恢复鼠标的形状。?CWinApp:SaveAllModified()CWinApp:CloseAllDocuments(BOOL bEndSession)这两个函数都遍历模板管理器列表,并分别对列表中的模板管理器对象逐个调用CDocManager 的同名成员函数:CDocManager:SaveAllModified()CDocManager:CloseAllDocuments(BOOL bEndSession)这两个函数都遍历其文档模板列表,并分别对列表中的模板对象逐个调用 CDocTemplate 的同名成员函数:CDocTemplate:SaveAllModifi
10、ed()CDocTemplate:CloseAllDocuments(BOOL bEndSession)这两个函数都遍历其文档列表,并分别对列表中的文档对象逐个调用 CDocuemnt 的成员函数:CDocument:SaveModified()CDocument:OnCloseDocument()?CDocument:SaveModified()CDocument:OnCloseDocument()CDocument:SaveModified 前面已作了解释。OnCloseDocument 是一个虚拟函数,其流程如图 6-2 所示。通过文档对象所对应的视,得到所有显示该文档的边框窗口的指针:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 应用程序的退出 应用程序 退出
限制150内