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函數終止消息循環,所以進程無法正常退出,被系統掛起。

參考鏈接:
https://blog.csdn.net/yangyihongyangjiying/java/article/details/44488343


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM