wxWidgets架構下基於wxDialog程式的標準退出方法

來源:互聯網
上載者:User
退出程式的標準方法是什麼呢?我覺得所謂的標準方法,是要使程式能夠做一些清理工作,而不是暴力退出,從而引起記憶體泄露和資源流失。
那麼現在我們要用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訊息的響應函數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.