退出程式的標準方法是什麼呢?我覺得所謂的標準方法,是要使程式能夠做一些清理工作,而不是暴力退出,從而引起記憶體泄露和資源流失。
那麼現在我們要用wxDec-C++建立一個基於wxDialog的程式,為了驗證程式是否標準退出,那麼我們要在wxAPP對象的OnExit()事件中寫上一個MessageBox,用來代表清理代碼。
int test1DlgApp::OnExit()
{
MessageBox(0,"OnExit","OnExit",MB_OK);
return 0;
}
同樣的,我們也應該在主視窗的OnClose事件中寫上一個MessageBox,代表清理代碼:
void test1Dlg::OnClose(wxCloseEvent& /*event*/)
{
MessageBox(0,"OnClose","OnClose",MB_OK);
Destroy();
}
好,按麼現在在主表單上放上一個按鈕,然後編寫按鈕的click事件的處理代碼:
/*
* WxButton1Click
*/
void test1Dlg::WxButton1Click(wxCommandEvent& event)
{
// insert your code here
//ExitProcess(0);
// this->EndModal(true);
::PostMessage((HWND__ *)this->GetHandle(),WM_CLOSE,0,0);
//::PostMessage((HWND__ *)this->GetHandle(),WM_QUIT,0,0);
//exit(0);
}
這裡展現了五種退出程式的方法,但是僅僅有一種能夠同時引發OnClose和OnExit事件,那就是:
::PostMessage((HWND__ *)this->GetHandle(),WM_CLOSE,0,0);
這兩種方法:ExitProcess(0);exit(0);都是強制結束了程式,沒有引發OnClose和OnExit事件;
而方法:this->EndModal(true);則僅僅是隱藏了視窗,並沒有使程式退出;
方法:::PostMessage((HWND__ *)this->GetHandle(),WM_QUIT,0,0);則僅僅引發了OnExit事件,卻沒有引發OnClose事件。發送WM_QUIT訊息和發送WM_CLOSE訊息的區別是什麼呢?為什麼會引起截然不同的效果,我上網尋找資料找到了答案:
“WM_CLOSE發給視窗或線程/進程通知關閉視窗或退出線程/進程。
你可以處理WM_CLOSE訊息。
WM_QUIT通知退出線程/進程,你不能處理WM_QUIT訊息,因為它使GetMessage返回0,從而使線程/進程退出。”
原來區別就在於,WM_QUIT使GetMessage函數返回0,而windows應用程式的訊息迴圈是一個while迴圈,GetMessage返回為真才會繼續迴圈下去,如果返回0,會直接結束while迴圈。而WM_CLOSE訊息就不同了,它會使訊息迴圈先處理WM_CLOSE訊息,這樣就可以引發OnClose()事件了,因為OnClose函數就是WM_CLOSE訊息的響應函數。