【问题标题】:Accessing MFC dialog elements from outside member class从外部成员类访问 MFC 对话框元素
【发布时间】:2013-04-19 17:13:04
【问题描述】:

我正在尝试从对话框类外部调用我的 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.

【问题讨论】:

  • 该解决方案对您很有效,因为您正在编写一个基于对话框的应用程序并希望获得指向应用程序主窗口的指针。虽然它适用于该特定情况下的其他人,但这不是万能药。
  • 您不应该从外部弄乱对话框的 GUI 元素。您可以在将来更改它们(将 EditBox 变为列表框,通过单选控件列表更改复选框......)。检查this article 以获得更好的解释、正确的做法等。
  • 谢谢。我有一种感觉,这不是很好的做法,但它对我的目的有用。以后我会看你的文章。

标签: visual-studio-2008 visual-c++ mfc static dialog


【解决方案1】:

有问题的代码是一行,所以我们无法真正逐行分析...让我们尝试更“细化”的代码:

Dlg aDlg = Dlg()

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

此时,我们只有一个 Dlg 对象的实例。尚未创建相应的 Windows 对话框(因为尚未调用 DoModalCreate)。那么我们尝试调用aDlg.getEditBoxContents()。大概这个成员函数试图获取某个编辑框的内容。但是没有我们可以获取其内容的编辑框。

在不知道你想要做什么的细节的情况下,通常你会想要一些这样的代码:

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

注意DoModal 创建了一个 modal 对话框,它将阻止访问程序中的其他窗口(这是一个过度概括,但请耐心等待;细节不太可能在这种情况下对你有所作为)。因此,aDlg.getEditBoxContents() 函数只有在您单击对话框上的关闭按钮、确定按钮或取消按钮后才会被调用。

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

【讨论】:

  • 谢谢。我的问题是我大概已经有一个Dlg 的实例在某个地方飞来飞去,其中包含带有用户输入的编辑框。当我创建一个新的aDlg 时,这不会让我访问一个用户尚未交互的新编辑框吗?
  • 如果你有一个Dlg 的实例,那么你应该使用它。 Dlg 的新实例不会让您访问另一个实例,也不会有一个编辑框,直到您告诉 Windows 使用CDialog::CreateCDialog::DoModal创建对话框。可以这样想:当您创建Dlg 的实例时,您实际上有一个盒子。你可以随心所欲地在盒子里看,但除非你把东西放进去,否则盒子是空的。在这种情况下,您可以通过创建 underlying Windows 对话框(与 Dlg 实例不同)在其中添加一些内容。
  • 是的,你是对的。我想使用已经存在的实例。问题是我找不到对话框的实例......我知道这听起来很荒谬,但自动生成的代码似乎以非标准方式实例化对话框。我找不到! (我已将OnInitDialog() 代码添加到我的问题中,以防万一。)
  • 啊 - 如果你查看 InitInstance 类,你会看到它被实例化了。试试CEx3Dlg *pMainDlg = (CEx3Dlg *)AfxGetMainWnd(),你会得到一个指向那个对话框的指针。
  • 太棒了!现在我做CEx3Dlg *pMainDlg = (CEx3Dlg *)AfxGetMainWnd(); pMainDlg->exp_ListBox.AddString("whatever");
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
相关资源
最近更新 更多