无法在表单CDialog MFC对话框窗体中获取文本信息到成员变量

时间:2014-04-03 13:51:13

标签: visual-c++ mfc

我有一个带有编辑文本控件的小对话框:

#include "stdafx.h"
#include "MyDlg3.h"
#include "afxdialogex.h"


// MyDlg3 dialog

IMPLEMENT_DYNAMIC(MyDlg3, CDialog)

MyDlg3::MyDlg3(CWnd* pParent /*=NULL*/)
    : CDialog(MyDlg3::IDD, pParent)
    , m_edit(_T(""))
{

}

MyDlg3::~MyDlg3()
{
}

void MyDlg3::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, m_edit);
}


BEGIN_MESSAGE_MAP(MyDlg3, CDialog)
    ON_BN_CLICKED(IDOK, &MyDlg3::OnBnClickedOk)
END_MESSAGE_MAP()


// MyDlg3 message handlers


void MyDlg3::OnBnClickedOk()
{
    txt=m_edit;
    // TODO: Add your control notification handler code here
    CDialog::OnOK();
}

我有一个简单的应用程序来调用这个对话框:

BOOL CPreparationApp::InitInstance()
{
    MyDlg3 Dlg3;
    Dlg3.DoModal();
    CString strLine0=Dlg3.txt;
     return true;
}

我无法找到为什么我无法将对话框Text Control中输入的文本转换为txt和strLine0变量。

我发现如果我从CDialogEx制作MyDlg3(而不是像现在这样来自CDialog) - 一切都很顺利。哪里有问题?

3 个答案:

答案 0 :(得分:0)

CDialog::OnOK()MyDlg3::OnBnClickedOk()的调用会设置成员变量m_edit,因此您可以编写类似

的逻辑
MyDlg3 Dlg3;
Dlg3.DoModal();
CString strLine0 = Dlg3.m_edit;

同时确保将m_edit声明为公开。

答案 1 :(得分:0)

文本在控件和DoDataExchange中的成员变量之间传输。如您在UpdateData的文档中所看到的那样DoDataExchange时会调用CDialog::OnOK。通过在此之前复制该值,您将无法获得任何结果。您可以通过在调用OnOK之后移动副本来解决此问题,或者您可以按照另一个答案的建议完全跳过该副本并直接使用成员变量。

答案 2 :(得分:0)

试试这个:

BOOL CPreparationApp::InitInstance()
{
    MyDlg3 Dlg3;
    if(Dlg3.DoModal()==IDOK);
    {
       CString strLine0=Dlg3.txt;
       return true;
    }
    return false;
}