使用有模式對話框時在對話框彈出後調用函數不會當即返回,而是等到對話框銷燬後纔會返回(請注意在對話框彈出後其餘窗口的消息依然會被傳遞)。因此在使用對話框時其餘窗口都不能接收用戶輸入。建立有模式對話框的方法是調用CDialog::DoModal()。下面的代碼演示了這種用法: 函數
CYourView::OnOpenDlg() { CYourDlg dlg; int iRet=dlg.DoModal(); }
CDialog::DoModal()的返回值爲IDOK,IDCANCEL。代表操做者在對話框上選擇「確認」或是「取消」。因爲在對話框銷燬前DoModal不會返回,因此可使用局部變量來引用對象。在退出函數體後對象同時也會被銷燬。而對於無模式對話框則不能這樣使用,下節5.3 建立無模式對話框中會詳細講解。 spa
你須要根據DoModal()的返回值來決定你下一步的動做,而獲得返回值也是使用有模式對話框的一個很大緣由。
使用有模式對話框須要注意一些問題,好比說不要在一些反覆出現的事件處理過程當中生成有模式對話框,好比說在定時器中產生有模式對話框,由於在上一個對話框還未退出時,定時器消息又會引發下一個對話框的彈出。
一樣的在你的對話框類中爲了向調用者返回不一樣的值能夠調用CDialog::OnOK()或是CDialog::OnCancel()以返回IDOK或IDCANCEL,若是你但願返回其餘的值,你須要調用 code
CDialog::EndDialog( int nResult );
其中nResult會做爲DoModal()調用的返回值對象
virtual INT_PTR CDialog::DoModal();
當dlg.DoModal()後,顯示一個模態對話框,此時DoModal()函數並不返回,直到用戶關閉此對話框時,DoModal才返回。若是用戶點擊了肯定按鈕,那麼DoModal()函數就返回IDOK。IDOK是一個宏。blog
當你CMyDlg dlg;時,對話框並無顯示,只要構造了一個CMyDlg類型的對象而已,直到用戶調用DoModal(),對話框纔會顯示出來。事件