Visual studio 2008 从成员类外部访问MFC对话框元素
我试图从dialog类外部调用MFC dialog类的非静态函数(它获取编辑框的值并以字符串形式返回) 也就是说,我有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()会给我带来神秘的错误(我确信这不是我应该做的方式) 有
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
的新实例将不允许您访问另一个实例,也不会有编辑框