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



我试图从对话框类外部调用我的MFC对话框类的非静态函数(它获得编辑框的值并将其作为字符串返回)。

也就是说,我有Dlg.cppcalc.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()

所以,这里我们声明了一个Dlg类型的变量aDlg。它使用默认构造函数初始化。然后,我们构建一个新的对话框(=右侧的Dlg()部分)并将其赋值给aDlg变量。

此时,我们所拥有的只是一个Dlg对象的实例。相应的Windows对话框没有被创建(因为DoModalCreate没有被调用)。然后我们尝试调用aDlg.getEditBoxContents()。假设这个成员函数试图获取某个编辑框的内容。但是没有编辑框的内容我们可以得到。

如果不知道你要做什么的细节,通常你会想要这样的代码:

Dlg aDlg;
aDlg.DoModal(); /* create and display the dialog */
aDlg.getEditBoxContents();

注意,DoModal创建了一个模态对话框,它将阻止访问程序中的其他窗口(这是一个过度概括,但请耐心等待一会儿;在这种情况下,细节不太可能对你产生影响)。因此,aDlg.getEditBoxContents()函数将不会被调用,直到您点击关闭按钮,或OK按钮或取消按钮上的对话框。

如果不了解更多,很难提供帮助,但我希望这能给你一个开始的地方。

最新更新