【问题标题】:create dialog in dialog visual studio在对话视觉工作室中创建对话
【发布时间】:2025-12-24 10:10:06
【问题描述】:

我正在尝试为我的用户创建一个“表单”类型的输入,因此我在 Visual Studio 中有一个 C++ 对话框项目。这个项目有许多可以填写的字段。其中一个字段需要更多信息,所以我想为此应用程序创建一个“子对话框”。我弹出子对话框,但无法弄清楚如何将信息返回到我的“主”应用程序中。

loan_info newLoan;
LoanDlg dlgAbout(&newLoan);
if (dlgAbout.DoModal() == IDOK)
{
    CString string;
    dlgAbout.GetDlgItemText(IDC_EDIT__LOAN_PRINCIPLE, string);
}

我在“GetDlgItemText”处收到一个错误 - 我似乎无法在此时获取对话框中的元素(因为 dlgAbout 现在为 NULL)。 任何有关在“对话”Visual Studio 项目中创建和访问对话的指针都将不胜感激。 谢谢。

【问题讨论】:

  • 一旦对话框关闭,您将无法使用GetDlgItemTextGetDlgItemText 只能用于现有窗口。一旦对话框关闭(例如单击“确定”),对话框窗口就不再存在。主题很广,请谷歌“mfc modal dialog tutorial”。 This tutorial 看起来不错。
  • 在子对话框的OnOK() 处理程序中,调用GetDlgItemText() 并将结果存储到“LoanDlg”类的成员变量中。或者,如果您使用了向导并为控件创建了成员变量,只需调用UpdateData(TRUE)(如果基类中的默认实现已经这样做了,可能也不需要这样做)。无论哪种情况,在子对话框关闭后,其控件当然不可用,但对话框的 C++ 类将可用,数据也将可用(可通过成员变量访问,例如 dlgAbout.szLoanPrinciple)。

标签: c++ mfc dialog


【解决方案1】:

MFC 在某种程度上是原生 Windows 资源的 C++ 资源包装器。通常,C++ 对象的生命周期与被包装资源的生命周期一致。一个值得注意的例外是CDialog 派生类,其中实例的寿命比原生窗口资源长。

在这种情况下,一旦DoModal 返回,您将无法访问本机窗口层次结构。这就是GetDlgItemText 试图做的事情。它可能会在 Debug 构建中显示一个失败的调试断言对话框来通知您这一点。

要解决此问题,您必须将对话框的数据保留足够长的时间,以便在本机窗口被销毁后可以访问它。一个常见的解决方案是将数据作为公共类成员存储在对话框包装类中。然后,您可以在用户输入数据时手动更新类成员,或者使用 MFC 的内置支持将类成员绑定到控件。推荐后者。详细信息可在 MSDN 中找到:Dialog Data Exchange and Validation

【讨论】: