【问题标题】:Can't get text info to member variable in form CDialog MFC dialog form无法将文本信息获取到表单 CDialog MFC 对话框表单中的成员变量
【发布时间】:2014-05-15 09:53:17
【问题描述】:

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

#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 制作)- 一切都很好。问题出在哪里?

【问题讨论】:

  • 应该没问题,CDialogEx继承自CDialog。除非涉及获取数据的某些内容是私有的。我通常更喜欢使用 DDX_Control 和 GetWindowText。
  • 在 OnBnClickedOk 期间 m_edit 仍然是空字符串。我对 DDX_Control 和 GetWindowText 有相同的结果。为什么你更喜欢 DDX_Control?编写简单的字符串赋值比 GetWindowText 更容易。
  • 我正在检查您的代码,但我的字符串保持为空,可以使用 DDX_Control 和 GetWindowText。我更喜欢这种方式主要是因为我们使用 3rd 方库,并且设置/获取文本并不是我们在控件上做的唯一事情;此外,我更喜欢对正在发生的事情有更多的控制权,但这是个人观点。

标签: visual-c++ mfc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    MyDlg3::OnBnClickedOk() 中调用CDialog::OnOK() 设置了成员变量m_edit,所以你可以这样写逻辑

    MyDlg3 Dlg3;
    Dlg3.DoModal();
    CString strLine0 = Dlg3.m_edit;
    

    同时确保 m_edit 被声明为公共。

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

      • 请在您的代码中发布一些解释。尝试并说明导致错误的原因,以及您如何解决它。
      猜你喜欢
      • 1970-01-01
      • 2013-01-30
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      相关资源
      最近更新 更多