一個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派生)或者文檔邊框窗口(從CMDIChildWnd派生)的關閉。
該函數的原型如下,流程如圖6-1所示:
void CFrameWnd::OnClose()
從圖6-1中可以看出,它首先判斷是否可以關閉窗口(m_lpfnCloseProc是函數指針類型的成員變量,用於打印預覽等情況下),然後,根據具體情況進行處理:
如果是主窗口被關閉,則關閉程序的所有文檔,銷毀所有窗口,退出程序;
如果不是主窗口被關閉,則是文檔邊框窗口被關閉,又分兩種情況:若該窗口所顯示的文檔被且僅被該窗口顯示,則關閉文檔和文檔窗口並銷毀窗口;若該窗口顯示的文檔還被其他文檔邊框窗口所顯示,則僅僅關閉和銷毀文檔窗口。