好吧,基本上我有一個MFC應用程序,需要循環大量對話框。基本上,當您單擊一個按鈕轉到另一個對話框時,我希望先前的對話框關閉。現在對話框只顯示在對方的頂部。新對話框打開後,如何關閉對話框?下面是一些示例代碼:如何使用do modal關閉對話框
void CMachine2Dlg::OnBnClickedNewmc()
{
NameDlg Dlg;
Dlg.DoModal()
}
好吧,基本上我有一個MFC應用程序,需要循環大量對話框。基本上,當您單擊一個按鈕轉到另一個對話框時,我希望先前的對話框關閉。現在對話框只顯示在對方的頂部。新對話框打開後,如何關閉對話框?下面是一些示例代碼:如何使用do modal關閉對話框
void CMachine2Dlg::OnBnClickedNewmc()
{
NameDlg Dlg;
Dlg.DoModal()
}
當新對話框DoModal()
新對話框結束後,您可以做的是隱藏父對話框並將其銷燬。我還沒有在下面測試ShowWindow()
,但是你明白了,如果它不隱藏對話框尋找另一個類似的功能。
void CMachine2Dlg::OnBnClickedNewmc()
{
ShowWindow(SW_HIDE);
NameDlg Dlg;
Dlg.DoModal();
EndDialog(0);
}
你可以嘗試調用
EndDialog(nResult);
IT將很難鏈的對話框中你提到的方式。模態通常意味着完全實現你正在經歷的事情。即:對話彈出了前一個。要做到這一點
一種方法是在調用第一個對話框,並使用一個對話框的返回值,以確定是否需要顯示第二個等等的類來創建模式對話框序列。
對於前:
// define a bunch of constants, any number would do,
// I would avoid 0 and 1 as they usually mean success/error
// This code can be returned in the EndDialog call in a method of your choice (say button click handler).
const int c_needNextDialog = 101;
dialog1 dlg1;
if(dlg1.DoModal() == c_needNextDialog)
{
dialog2 dlg2;
if(dlg2.DoModal() == c_needNextDialog)
{
... and so forth
}
}
我敢肯定你的想法...
在對話框中,您返回像這樣(直接從MSF拍攝)
void dialog1::OnSomeAction()
{
// Do something
EndDialog(c_needNextDialog); // This value is returned by DoModal!
// Do something
return; // Dialog closed and DoModal returns only here!
}
我會避開無模式的對話框,最終會遇到另一個問題,比如如何控制對話框的流動並阻止用戶點擊應用程序的主窗口。
OnOK()
,OnCancel()
或EndDialog(nResult)
將回答您的標題問題。
但是,像@tenfour建議的那樣,您應該使用屬性表/嚮導。它也可以是一個單獨的對話窗口,其中包含多個顯示或隱藏的子資源頁面窗口,具體取決於您想要查看的內容。
對於這一點,你將需要:
爲對話框和每個屬性頁面創建一個類,將每個屬性頁面的成員變量添加到對話框中,創建屬性頁面並使用框架作爲參考放置它們。點擊按鈕時只顯示/隱藏必要的頁面。
@tenfour提出一個很好的解決方案可能但 如果你們不能 你應該從一個基本的Windows/DLG
Mydialog dlg1
if(dlg1.DoModal())
{
//do something
}
else
// do something else
Mydialog dlg2
if(dlg2.DoModal())
{
//do something
}
else
// do something else
等創建對話框....
這方式你不容易控制「發生了什麼」,你不必亂用不同的窗口,信息環路。
你可以稱之爲OnCancel()對話框類中。像:this->OnCancel();
您是否考慮過使用[屬性表或嚮導](http://msdn.microsoft.com/en-us/library/windows/desktop/bb774540(v = vs.85).aspx)? (哦,上帝,我聽起來像clippy!) – tenfour