【发布时间】:2015-07-11 05:48:52
【问题描述】:
在 MFC 中,对于典型的对话框窗口,当 MFC 调用 OnOK() 时,该函数调用 EndDialog() 函数,并且不知何故调用了类析构函数。
假设我有一个公共变量,一个名为“test”的字符串,在 CDialog 的类中,并且在对话框 OK 按钮的 onBnClick() 事件中,我将这个“test”变量设置为一个值。然后我声明一个对话框的实例,并从我的主窗口的类中调用 DoModal()。我可以从 DoModal() 返回后设置的变量中读取,没问题。
void Dialog1::OnBnClickedOk()
{
test = "The test string has been set.";
OnOK();
}
void CMainFrame::OnEditTest()
{
Dialog1 dlg;
dlg.DoModal();
MessageBox(dlg.test, L"Main Frm",0);
}
这可行,但如果我有一个包含多个字段的对话框,并且每个字段都有一个变量,该怎么办。在调用析构函数之前,如何确定可以从所有变量中读取所有值?我查了 MSDN,我的理解是 OnOK() 函数调用了 EndDialog(),并且在某个时刻,在 EndDialog() 之后,调用了类析构函数。我希望始终能够从 OnBnClick() 事件设置的变量中读取值,但我不知道 MFC 何时调用类析构函数。有谁知道 EndDialog() 触发后何时调用析构函数?
谢谢, 闪电战
【问题讨论】:
-
在上述代码中,
dlg将一直有效,直到OnEditTest()返回。因此,您有足够的时间读取任意数量的值。 -
你是否恰好知道析构函数何时被调用?从堆栈中删除 dlg 时是否调用它?我在 MSDN 中找不到此信息。
-
Dialog1是一个常规的 C++ 类,适用 C++ 生命周期规则。 MSDN 没有记录标准 C++。 -
谢谢。在 C++ 中我还有很多东西要学。
-
使用 Spy++,您将知道事件的确切顺序。