我已经按照这个问题制作了一个非模态/无模态对话框: How to display a non-modal CDialog?
我在 VS2008 中使用 MFC/C++。与 MFC 和 C++ 相比,我更擅长 C# 和 .net。
我的表单中有一个启动对话框的菜单项。只能打开一个对话框实例。该对话框显示正常。我可以通过单击角落中的 X 来关闭它,它会在我关闭主窗体时关闭。我遇到的问题是单击 X 关闭对话框后无法再次打开对话框。我知道这是因为指针永远不会设置回 NULL。
我在表单的头文件中有这个:
CChildDialog *m_pDialog;
我在表单的构造函数中有这部分:
m_pDialog = NULL;
当单击菜单项时,我在菜单项的方法中有此代码(我从另一个 SO 答案修改了它,因为我只想打开对话框的一个实例):
if(m_pDialog == NULL)
{
// Invoking the Dialog
m_pDialog = new CChildDialog();
BOOL ret = m_pDialog->Create(IDD_CHILDDIALOG, this);
if (!ret) //Create failed.
{
AfxMessageBox(_T("Error creating Dialog"));
}
m_pDialog->ShowWindow(SW_SHOW);
}
现在我知道我需要执行这部分并将指针设置为 NULL,但我不知道该放在哪里:
// Delete the dialog once done
delete m_pDialog;
m_pDialog = NULL;
如果对话框已被释放,我是否需要继续监视?对话框关闭时是否有事件触发到父窗体?
最佳答案
如果你想在用 X 关闭窗口后回收窗口的内容,你必须在你的对话框中处理 WM_CLOSE 消息:
void CChildDialog::OnClose()
{
ShowWindow(SW_HIDE);
}
然后在打开窗口的代码中:
if(m_pDialog == NULL)
{
// Invoking the Dialog
m_pDialog = new CChildDialog();
BOOL ret = m_pDialog->Create(IDD_CHILDDIALOG, this);
if (!ret) //Create failed.
{
AfxMessageBox(_T("Error creating Dialog"));
}
}
m_pDialog->ShowWindow(SW_SHOW); //moved outside the if(m_pDialog == NULL)
希望对你有帮助
关于c++ - 如何检测无模式 CDialog 是否已关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11868858/