2011-10-25 23 views
0

好吧,基本上我有一個MFC應用程序,需要循環大量對話框。基本上,當您單擊一個按鈕轉到另一個對話框時,我希望先前的對話框關閉。現在對話框只顯示在對方的頂部。新對話框打開後,如何關閉對話框?下面是一些示例代碼:如何使用do modal關閉對話框

void CMachine2Dlg::OnBnClickedNewmc() 
{ 
    NameDlg Dlg; 
    Dlg.DoModal()  

    } 
+3

您是否考慮過使用[屬性表或嚮導](http://msdn.microsoft.com/en-us/library/windows/desktop/bb774540(v = vs.85).aspx)? (哦,上帝,我聽起來像clippy!) – tenfour

回答

6

當新對話框DoModal()新對話框結束後,您可以做的是隱藏父對話框並將其銷燬。我還沒有在下面測試ShowWindow(),但是你明白了,如果它不隱藏對話框尋找另一個類似的功能。

void CMachine2Dlg::OnBnClickedNewmc() 
{ 
    ShowWindow(SW_HIDE); 

    NameDlg Dlg; 
    Dlg.DoModal(); 

    EndDialog(0); 

} 
2

你可以嘗試調用

EndDialog(nResult); 
5

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! 
} 

我會避開無模式的對話框,最終會遇到另一個問題,比如如何控制對話框的流動並阻止用戶點擊應用程序的主窗口。

2

OnOK()OnCancel()EndDialog(nResult)將回答您的標題問題。

但是,像@tenfour建議的那樣,您應該使用屬性表/嚮導。它也可以是一個單獨的對話窗口,其中包含多個顯示或隱藏的子資源頁面窗口,具體取決於您想要查看的內容。

對於這一點,你將需要:

  • 1對話窗口,可能與上一頁/下一頁按鈕
  • 1圖片框鏡架的款式,不可見,對話框裏你想要的子窗口出現
  • n屬性頁,子樣式,無邊框,你把所有的控件。

爲對話框和每個屬性頁面創建一個類,將每個屬性頁面的成員變量添加到對話框中,創建屬性頁面並使用框架作爲參考放置它們。點擊按鈕時只顯示/隱藏必要的頁面。

1

@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 

等創建對話框....

這方式你不容易控制「發生了什麼」,你不必亂用不同的窗口,信息環路。

1

你可以稱之爲OnCancel()對話框類中。像:this->OnCancel();