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

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

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

相关文章:

c++ - initializer_list、构造函数和支撑初始化

c# - 如何为 VS 2008 中的 C# 解决方案创建一个独立的可执行文件,在一个构建中包含多个项目和多个表单?

c++ - MFC CList 是否支持复制赋值?

与 IXMLDOMNode* 相关的 C++ 错误

c++ - 存储所有变量的参数文件

c++ - 基于插入顺序的第一个最重复的单词

c++ - 在 C++ 中截断十进制值

c++ - 在 C++ Qt 中将二维 vector/二维数组显示为简单图形

c++ - 将工作空间(WINCE设备com)转换为兼容PC的工作空间

visual-studio-2008 - 停止调试,但继续运行应用程序(VS2008 asp.net web 应用程序)