使用有模式對話框時在對話框彈出後調用函數不會立即返回,而是等到對話框銷毀後才會返回(請注意在對話框彈出後其他窗口的消息依然會被傳遞)。所以在使用對話框時其他窗口都不能接收用戶輸入。創建有模式對話框的方法是調用CDialog::DoModal()。下面的代碼演示了這種用法:
CYourView::OnOpenDlg()
{
CYourDlg dlg;
int iRet=dlg.DoModal();
}
CDialog::DoModal()的返回值為IDOK,IDCANCEL。表明操作者在對話框上選擇“確認”或是“取消”。由於在對話框銷毀前DoModal不會返回,所以可以使用局部變量來引用對象。在退出函數體後對象同時也會被銷毀。而對於無模式對話框則不能這樣使用,下節5.3 創建無模式對話框中會詳細講解。
你需要根據DoModal()的返回值來決定你下一步的動作,而得到返回值也是使用有模式對話框的一個很大原因。
使用有模式對話框需要注意一些問題,比如說不要在一些反復出現的事件處理過程中生成有模式對話框,比如說在定時器中產生有模式對話框,因為在上一個對話框還未退出時,定時器消息又會引起下一個對話框的彈出。
同樣的在你的對話框類中為了向調用者返回不同的值可以調用CDialog::OnOK()或是CDialog::OnCancel()以返回IDOK或IDCANCEL,如果你希望返回其他的值,你需要調用
CDialog::EndDialog( int nResult );其中nResult會作為DoModal()調用的返回值。
下面的代碼演示了如何使用自己的函數來退出對話框:
void CMy52_s1View::OnLButtonDown(UINT nFlags, CPoint point)
{//創建對話框並得到返回值
CView::OnLButtonDown(nFlags, point);
CTestDlg dlg;
int iRet=dlg.DoModal();
CString szOut;
szOut.Format("return value %d",iRet);
AfxMessageBox(szOut);
}
//重載OnOK,OnCancel
void CTestDlg::OnOK()
{//什麼也不做
}
void CTestDlg::OnCancel()
{//什麼也不做
}
//在對話框中對三個按鈕消息進行映射
void CTestDlg::OnExit1()
{