2011-05-10 60 views
3

從模態MFC對話框中,我想在對話框關閉後從編輯框中提取文本。我試過這個:從模態MFC對話框關閉後獲取編輯框文本

CPreparationDlg Dlg; 
CString m_str; 

m_pMainWnd = &Dlg; 
Dlg.DoModal(); 
CWnd *pMyDialog=AfxGetMainWnd(); 
CWnd *pWnd=pMyDialog->GetDlgItem(IDC_EDIT1); 
pWnd->SetWindowText("huha max"); 
return TRUE; 

它不起作用。

回答

21

直到您調用DoModal()並且已經指出,在DoModal()返回時已經銷燬該對話框及其控件。因此,您無法在DoModal()之前或之後調用GetDlgItem()。傳遞或檢索數據到控件的解決方案是在類中使用一個變量。在調用DoModal()之前,可以在創建類實例時對其進行設置。在OnInitDialog()中,你把控制變量的值。然後,當窗口被銷燬時,您從控件獲取值並將其放入變量中。然後你從調用上下文中讀取變量。

像這樣的東西(注意我直接在瀏覽器中鍵入它,所以有可能是錯誤的):

class CMyDialog : CDialog 
{ 
    CString m_value; 
public: 
    CString GetValue() const {return m_value;} 
    void SetValue(const CString& value) {m_value = value;} 

    virtual BOOL OnInitDialog(); 
    virtual BOOL DestroyWindow(); 
} 

BOOL CMyDialog::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 

    SetDlgItemText(IDC_EDIT1, m_value); 

    return TRUE; 
} 

BOOL CMyDialog::DestroyWindow() 
{ 
    GetDlgItemText(IDC_EDIT1, m_value); 

    return CDialog::DestroyWindow(); 
} 

然後你可以使用它像這樣:

CMyDialog dlg; 

dlg.SetValue("stackoverflow"); 

dlg.DoModal(); 

CString response = dlg.GetValue(); 
+0

thnx您的評論,你可以給我的代碼與你說的變化.. – abhinav 2011-05-10 06:06:25

+0

我已經編輯了上面的例子與答案。 – 2011-05-10 06:31:23

+0

Thnx現在工作很多,你對我很重。 – abhinav 2011-05-10 07:49:55

0

DoModal()在它返回之前破壞對話框,所以該值不再可用。

很難說出你爲什麼要在對話框中設置m_pMainWnd。說實話,我不確定你在那裏做什麼。這肯定會導致問題,因爲現在AfxGetMainWnd()已被破壞。

無論採用哪種方式,在對話框銷燬後都無法獲得對話框的控制值。

+0

日Thnx的評論,我非常新的這個VC++ MFC, 我已刪除了該行即使如此,它沒有運行,你可以指出 另一種方式來提取來自一個字段的數據 – abhinav 2011-05-10 05:35:00

+0

它不從這裏運行 ASSERT(:: IsWindow(m_hWnd)); – abhinav 2011-05-10 05:46:17

+0

它沒有運行,因爲這個錯誤\t ASSERT(:: IsWindow(m_hWnd)); – abhinav 2011-05-10 05:47:25

2
  1. 打開對話框資源,右鍵單擊文本框並選擇「添加變量」,選擇值類型和CString
  2. 在對話框類中:在關閉之前,請撥打UpdateData(TRUE)
  3. 的對話外:

    CPreparationDlg dlg(AfxGetMainWnd()); 
    
    dlg.m_myVariableName = "my Value"; 
    
    dlg.DoModal(); 
    

    //新值仍處於dlg.m_myVariableName

0

我經常使用

D_SOHINH dsohinh = new D_SOHINH(); 
    dsohinh.vd_kichthuoc=v_kichthuocDOC; 
    dsohinh.vd_sohinh=v_soluongDOC; 
    if(dsohinh.DoModal()==IDOK) 
    { 
     v_soluongDOC=dsohinh.vd_sohinh; 
     v_kichthuocDOC=dsohinh.vd_kichthuoc; 
    } 
    SetModifiedFlag(true); 
    UpdateAllViews(NULL); 

隨着dsohinh是對話形式,你想要獲取數據到mainform。 獲取數據後,調用SetModifiedFlag(true)設置更新的視圖數據。 調用的UpdateAllViews(NULL)設置數據的MainForm