Visual c++ Can';t获取表单CDialog MFC对话框表单中成员变量的文本信息
我有一个带有编辑文本控件的小对话框窗体:Visual c++ Can';t获取表单CDialog MFC对话框表单中成员变量的文本信息,visual-c++,mfc,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("")) { } MyDlg
#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;
}
我找不到为什么不能将对话框文本控件中输入的文本转换为txt和strLine0变量
我发现,如果我使用CDialogEx制作MyDlg3(而不是像现在这样使用CDialog),一切都会很顺利。问题在哪里?在
MyDlg3::OnBnClickedOk()
中调用CDialog::OnOK()
设置成员变量m_edit
,这样您就可以编写如下逻辑
MyDlg3 Dlg3;
Dlg3.DoModal();
CString strLine0 = Dlg3.m_edit;
确保
m_edit
声明为public。文本在DoDataExchange
中的控件和成员变量之间传输<代码>DoDataExchange在执行CDDialog::OnOK
时被调用,您可以在的文档中看到这一点。在此之前复制该值不会得到任何结果。您可以通过在调用OnOK后移动副本来解决此问题,也可以根据另一个答案的建议完全跳过副本,直接使用成员变量。尝试以下操作:
BOOL CPreparationApp::InitInstance()
{
MyDlg3 Dlg3;
if(Dlg3.DoModal()==IDOK);
{
CString strLine0=Dlg3.txt;
return true;
}
return false;
}
应该没有问题,CDialogEx继承自CDialog。除非获取数据的某些东西是私人的。我通常更喜欢使用DDX_控件和GetWindowText。在OnBnClickedOk期间,m_编辑仍然是空字符串。我对DDX_控件和GetWindowText有相同的结果。为什么您更喜欢DDX_控制?编写简单的字符串赋值比GetWindowText更容易。我正在检查代码,但我的字符串保持为空,使用DDX_控件和GetWindowText也可以。我更喜欢这种方式,主要是因为我们使用第三方库,设置/获取文本并不是我们在控件上所做的唯一事情;此外,我更希望对正在发生的事情有更多的控制权,但这是我个人的观点。请用你的代码发布一些解释。试着说明是什么导致了错误,以及你是如何解决的。