1、當(dāng)你按下了“關(guān)閉”按鈕或選取了“退出”菜單項(xiàng)之后,WM_CLOSE消息被發(fā)送給了應(yīng)用程序的窗口處理過程函數(shù)。該函數(shù)對(duì)該消息的缺省處理僅為調(diào)用DestroyWindow()API函數(shù),導(dǎo)致窗口被銷毀。
2、當(dāng)窗口的客戶區(qū)被銷毀的時(shí)候WM_DESTROY消息被發(fā)給了應(yīng)用程序的窗口處理過程。程序員可以在此釋放他自己分配的與窗口客戶區(qū)相關(guān)的資源,而窗口過程函數(shù)缺省的處理僅為調(diào)用PostQuitMessage()函數(shù),這將導(dǎo)致WM_QUIT消息被送進(jìn)應(yīng)用程序的消息隊(duì)列。
3、隨后窗口的非客戶區(qū)(包括菜單欄、標(biāo)題欄、狀態(tài)欄等)被銷毀,此時(shí)WM_NCDESTROY消息被發(fā)送給了應(yīng)用程序的窗口過程。這個(gè)消息也是窗口過程處理的最后一個(gè)消息,程序員可以在這里釋放他自己分配的而一直沒有釋放的內(nèi)存。使用了MFC創(chuàng)建的應(yīng)用程序往往要在這個(gè)消息響應(yīng)函數(shù)當(dāng)中進(jìn)行一些釋放內(nèi)存和資源的工作。
4、而應(yīng)用程序的消息檢測(cè)函數(shù)GetMessage()一旦檢索到WM_QUIT消息,就會(huì)返回False,從而結(jié)束消息循環(huán),并且讓應(yīng)用程序的WinMain()函數(shù)返回,從而結(jié)束應(yīng)用程序。因此應(yīng)用程序的窗口處理過程是不可能處理到這條WM_QUIT消息的。
5、綜上所述,如果我們是用SDK方法編寫應(yīng)用程序而又不需要在程序結(jié)束的時(shí)候釋放用new及其他內(nèi)存分配函數(shù)顯式分配的內(nèi)存的話,我們完全可以直接通過向應(yīng)用程序發(fā)送WM_QUIT消息讓程序退出。
6、如果我們利用了MFC創(chuàng)建應(yīng)用程序則最好通過發(fā)送WM_CLOSE消息讓應(yīng)用程序結(jié)束。因?yàn)镸FC往往要在最后時(shí)刻進(jìn)行一些清理工作。