mfc關閉模態dialog的正確方式

在模態對話框中:

正常的用戶觸發的OnOK 、OnCancel消息都是通過調用函數EndDialog去關閉模態對話框的,EndDialog函數並不立即清除對話框。而是設置一個標誌,並且允許對話框應用程序把控制權返回系統。系統在試圖從應用程序隊列檢索下一個消息之前檢測標誌。如果已經設置了標誌則系統中止消息循環,清除對話框,所以當我們想在代碼中去調用EndDialog函數去結束對話框,最後再釋放對話框對象。

函數原型:BOOL EndDialog(HWND hDlg,int nResult); 
  參數: 
  hDlg:表示要被清除的對話框窗口。 
  NResult:指定從創建對話框函數返回到應用程序的值。 
  返回值:如果函數調用成功,則返回值爲非零值;如果函數調用失敗則返回值爲零。若想獲得錯誤信息請調用GetLastError函數


EndDialog 與 DestroyWindow 的區別
(1) EndDialog(-1);

關閉模態對話框,並且將參數作爲父對話框調用的返回值。

(2)  DestroyWindow();  ::PostQuitMessage(0);

DestroyWindow 關閉非模態對話框。 退出消息循環,真正結束進程。有不少程序窗口關閉,但是不等於退出運行。CDialog::EndDialog

void EndDialog(int nResult);

參數:

nResult 對話框返回的值,用於調用者DoModal。
說明:

調用該成員函數來中止一個模態對話框。該函數返回nResult。無論模態對話框是何時被創建的,必須使用EndDialog來結束處理。

可以隨時調用EndDialog,即使在使用OnInitDialog時,即在對話框顯示或獲得輸入焦點之前就關閉它。

EndDialog不會立即關閉對話框。它設置了一個標記,用以指定在當前消息處理程序返回時就關閉對話框。


PS:今天遇到的問題:由於在模態對話框中調用了其他結束函數,沒有調用EndDialog函數終止消息循環,所以進程無法正常退出,被系統掛起。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章