应用程序退出应用程序的退出一个 Windows 应用程序启动之后, 一般是进入消息循环, 等待或者处理用户的输入,直到用户关闭应用程序窗口,退出应用程序为止。例如,用户按主窗口的关闭按钮,或者选择执行系统菜单“关闭”, 或者从“文件”菜单选择执行“退出”,都会导致主窗口被关闭。当用户从“文件”菜单选择执行“退出”时, 将发送 MFC 标准命令消息 ID_APP_EXIT 。 MFC 实现了函数 CWinApp::OnAppExit() 来完成对该命令消息的缺省处理。 void CWinApp::OnAppExit() { // same as double-clicking on main window close box ASSERT(m_pMainWnd != NULL); m_pMainWnd->SendMessage(WM_CLOSE); } 可以看出,其实现是向主窗口发送 WM_CLOSE 消息。主窗口处理完 WM_CLOSE 消息之后,关闭窗口,发送 WM_QUIT 消息,退出消息循环(见图 5-3 ),进而退出整个应用程序。边框窗口对 WM_CLOSE 的处理 MFC 提供了函数 CFrameWnd::OnClose 来处理各类边框窗口的关闭: 不仅包括 SDI 的边框窗口(从 CFrameWnd 派生), 而且包括 MDI 的主边框窗口(从 CMDIFrameWnd 派生) 或者文档边框窗口(从 CMDIChildWn d 派生) 的关闭。该函数的原型如下,流程如图 6-1 所示: void CFrameWnd::OnClose() 从图 6-1 中可以看出,它首先判断是否可以关闭窗口( m_lpfnCloseProc 是函数指针类型的成员变量, 用于打印预览等情况下),然后,根据具体情况进行处理: 如果是主窗口被关闭, 则关闭程序的所有文档, 销毁所有窗口, 退出程序; 如果不是主窗口被关闭,则是文档边框窗口被关闭,又分两种情况: 若该窗口所显示的文档被且仅被该窗口显示, 则关闭文档和文档窗口并销毁窗口;若该窗口显示的文档还被其他文档边框窗口所显示,则仅仅关闭和销毁文档窗口。下面是处理 WM_CLOSE 消息中涉及的一些函数。 BOOL CDocument::SaveModified() 该虚拟函数的缺省实现:首先调用 IsModifed 判断文档是否被修改, 没有修改就返回,否则继续。当询问用户是否保存被修改的文档时, 若用户表示“ cancel ”,返回 FALSE ;若用户表示“ no”,则返回 TRUE ;若用户表示“ yes ”,则存盘失败返回 FALSE , 存盘成功返回 TRUE 。存盘处理首先要得到被保存文件的名称,然后调用虚拟函数 OnSaveDocument 完成存盘工作, 并使用 SetModifidFlag(FALSE) 设置文档为没有修改。 BOOL CDocument::OnSaveDocument(LPCTSTR lpszPathName) 该函数是虚拟函数, 用来保存文件。其实现的功能和 OpOpenDocumen t 相反,但处理流程类似,描述如下: 根据 lpszPathName 打开文件 pFile ; 使用 pFile 构造一个用于写入数据的 CArchive 对象,此对象用来保存数据到文件; 设置鼠标为时间瓶形状; 使用 Serialize 函数完成序列化写; 完毕,恢复鼠标的形状。 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() CDocument::SaveModified() CDocument::OnCloseDocument() CDocument::SaveModified 前面已作了解释。 OnCloseDocum
应用程序退出 来自淘豆网m.daumloan.com转载请标明出处.