2011-05-10 99 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