![](/img/trans.png)
[英]How do I close a MFC Modal Dialog in another thread and can get the dialog return value?
[英]How to close a dialog box using do modal
好的,基本上我有一個MFC應用程序,其中包含許多需要循環瀏覽的對話框。 基本上,當您單擊一個按鈕轉到另一個對話框時,我希望關閉上一個對話框。 現在,對話框僅顯示在彼此之上。 打開新對話框后,如何關閉對話框? 這是一些示例代碼:
void CMachine2Dlg::OnBnClickedNewmc()
{
NameDlg Dlg;
Dlg.DoModal()
}
您可以做的是在DoModal()
新對話框時隱藏父對話框,並在新對話框結束后銷毀它。 我沒有測試下面的ShowWindow()
,但是您知道了,如果它沒有隱藏對話框,請尋找另一個類似的函數。
void CMachine2Dlg::OnBnClickedNewmc()
{
ShowWindow( SW_HIDE);
NameDlg Dlg;
Dlg.DoModal();
EndDialog( 0 );
}
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!
}
我將避免無模式對話框,您將面臨另一個問題,例如如何控制對話框的流程並防止人們單擊后面的應用程序主窗口。
您可以嘗試致電
EndDialog(nResult);
OnOK()
, OnCancel()
或EndDialog(nResult)
將回答您的標題問題。
但是,就像建議的@tenfour一樣,您應該使用屬性表/向導。 它也可以是具有多個子屬性頁面窗口的單個對話框窗口,您可以根據需要查看或隱藏它們。
為此,您將需要:
為對話框和每個屬性頁創建一個類,將每個屬性頁的成員變量添加到對話框,創建屬性頁,並使用框架作為放置它們的參考。 在按鈕上單擊僅顯示/隱藏必要的頁面。
您可以在對話框類中調用OnCancel() 。 像這樣: this->OnCancel();
@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
等等....
這樣,您就不容易控制“發生了什么”,也不必弄亂其他窗口,消息循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.