gpt4 book ai didi

c++ - 如何检测无模式 CDialog 是否已关闭?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:32 24 4
gpt4 key购买 nike

我已经按照这个问题制作了一个非模态/无模态对话框: 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com