Visual studio 2008 从成员类外部访问MFC对话框元素

Visual studio 2008 从成员类外部访问MFC对话框元素,visual-studio-2008,visual-c++,mfc,static,dialog,Visual Studio 2008,Visual C++,Mfc,Static,Dialog,我试图从dialog类外部调用MFC dialog类的非静态函数(它获取编辑框的值并以字符串形式返回) 也就是说,我有Dlg.cpp和calc.cpp,我想从calc.cpp调用getEditBoxContents()。我知道要调用一个非静态函数,我应该在calc.cpp中有一个Dlg元素,以便执行aDlg.getEditBoxContents()但是,执行Dlg aDlg=Dlg()然后执行aDlg.getEditBoxContents()会给我带来神秘的错误(我确信这不是我应该做的方式) 有

我试图从dialog类外部调用MFC dialog类的非静态函数(它获取编辑框的值并以字符串形式返回)

也就是说,我有
Dlg.cpp
calc.cpp
,我想从
calc.cpp
调用
getEditBoxContents()
。我知道要调用一个非静态函数,我应该在
calc.cpp
中有一个
Dlg
元素,以便执行
aDlg.getEditBoxContents()
但是,执行
Dlg aDlg=Dlg()
然后执行
aDlg.getEditBoxContents()
会给我带来神秘的错误(我确信这不是我应该做的方式)

有人能告诉我正确的方向吗,或者给我另一种从对话类之外获取编辑框内容的方法吗


感谢Nik,对我有效的解决方案是:

在非成员类中:

CEx3Dlg *pMainDlg = (CEx3Dlg *)AfxGetMainWnd();
pMainDlg->exp_ListBox.AddString("asd"); //Interact with GUI elements here.

所讨论的代码是一行,所以我们不能逐行分析它。。。让我们尝试一些更“颗粒化”的东西:

因此,这里我们声明一个类型为
Dlg
的变量,称为
aDlg
。它是使用默认构造函数初始化的。然后构造一个新对话框(位于
=
右侧的
Dlg()
部分),并将其分配给我们的
aDlg
变量

此时,我们只有一个Dlg对象的实例。尚未创建相应的Windows对话框(因为未调用
DoModal
Create
)。因此,我们尝试调用
aDlg.getEditBoxContents()
。可能这个成员函数试图获取某个编辑框的内容。但我们无法获得其内容的编辑框

通常,在不了解您尝试执行的操作的详细信息的情况下,您可能希望获得以下代码:

Dlg aDlg;
aDlg.DoModal(); /* create and display the dialog */
aDlg.getEditBoxContents();
请注意,
DoModal
创建了一个模式对话框,该对话框将阻止对程序中其他窗口的访问(这是一个过度概括,但请耐心等待;在这种情况下,细节可能不会对您产生影响)。因此,只有单击对话框上的关闭按钮、确定按钮或取消按钮,才会调用
aDlg.getEditBoxContents()
函数


如果不了解更多信息,很难提供帮助,但我希望这能为您提供一个起点。

所讨论的代码只有一行,因此我们无法逐行分析它。。。让我们尝试一些更“颗粒化”的东西:

因此,这里我们声明一个类型为
Dlg
的变量,称为
aDlg
。它是使用默认构造函数初始化的。然后构造一个新对话框(位于
=
右侧的
Dlg()
部分),并将其分配给我们的
aDlg
变量

此时,我们只有一个Dlg对象的实例。尚未创建相应的Windows对话框(因为未调用
DoModal
Create
)。因此,我们尝试调用
aDlg.getEditBoxContents()
。可能这个成员函数试图获取某个编辑框的内容。但我们无法获得其内容的编辑框

通常,在不了解您尝试执行的操作的详细信息的情况下,您可能希望获得以下代码:

Dlg aDlg;
aDlg.DoModal(); /* create and display the dialog */
aDlg.getEditBoxContents();
请注意,
DoModal
创建了一个模式对话框,该对话框将阻止对程序中其他窗口的访问(这是一个过度概括,但请耐心等待;在这种情况下,细节可能不会对您产生影响)。因此,只有单击对话框上的关闭按钮、确定按钮或取消按钮,才会调用
aDlg.getEditBoxContents()
函数


如果不知道更多,很难提供帮助,但我希望这能为您提供一个起点。

谢谢。我的问题是,我可能已经有了一个
Dlg
的实例,它在某个地方飞行,其中包含了用户输入的编辑框。当我创建一个新的
aDlg
时,这难道不能让我访问一个用户尚未连接的新编辑框吗?如果你有一个
Dlg
的实例,那么你应该使用它。除非您告诉Windows使用
CDialog::create
CDialog::DoModal
创建对话框,否则
Dlg
的新实例将不允许您访问另一个实例,也不会有编辑框。可以这样想:当您创建
Dlg
的实例时,实际上您有一个长方体。你可以随心所欲地往盒子里看,但除非你把什么东西放进去,否则盒子是空的。在本例中,您可以通过创建底层Windows对话框(与
Dlg
实例不同)在其中添加一些内容。是的,您是对的。我想使用已经存在的实例。问题是我找不到对话框的实例。。。我知道这听起来很可笑,但自动生成的代码似乎以非标准方式实例化了对话框。我找不到它!(我已经在我的问题中添加了
OnInitDialog()
代码,以防有所帮助。)啊-如果您查看
InitInstance
类,您将看到它被实例化。试试
CEx3Dlg*pMainDlg=(CEx3Dlg*)AfxGetMainWnd()
你会得到一个指向该对话框的指针。太棒了!现在我做了
CEx3Dlg*pMainDlg=(CEx3Dlg*)AfxGetMainWnd();pMainDlg->exp_ListBox.AddString(“任意”)谢谢。我的问题是,我可能已经有了一个
Dlg
的实例,它在某个地方飞行,其中包含了用户输入的编辑框。当我创建一个新的
aDlg
时,这难道不能让我访问一个用户尚未连接的新编辑框吗?如果你有一个
Dlg
的实例,那么你应该使用它。除非您告诉Windows使用
CDialog::create
CDi创建对话框,否则
Dlg
的新实例将不允许您访问另一个实例,也不会有编辑框