我在这里看到了类似的问题:

How to close a modeless MFC dialog in C++

这就是我关闭无模式对话的方式:

void CChristianLifeMinistryEditorDlg::OnDestroy()
{
    if (m_pAssignHistoryDlg != NULL)
    {
        delete m_pAssignHistoryDlg;
        m_pAssignHistoryDlg = NULL;
    }

    CDialogEx::OnDestroy();
}

直到今天,这一直是足够的 . 我发现的(偶然引用)是,如果无模式对话框有一个消息框,并且用户进入并关闭 parent 对话框,则无模式对话将保持在屏幕上,直到您关闭消息框 .

无模型对话显然仍然在事件处理程序中,因为它刚刚执行了一些操作并将结果显示给用户 .

是否有可能强迫它关闭?或者我应该以某种方式阻止我的父对话被关闭而无模型弹出窗口在屏幕上?

什么是正确的做法?

谢谢 .

Update:

我试过这个:

void CChristianLifeMinistryEditorDlg::OnDestroy()
{
    if (m_pAssignHistoryDlg != NULL)
    {
        CWnd *pPopupMessage = m_pAssignHistoryDlg->GetWindow(GW_ENABLEDPOPUP);
        if (pPopupMessage != NULL)
            pPopupMessage->PostMessage(WM_CLOSE);
        delete m_pAssignHistoryDlg;
        m_pAssignHistoryDlg = NULL;
    }
    CDialogEx::OnDestroy();
}

它没用 . 当我调试时,它拒绝处理该调用等,直到我自己解除了弹出消息框 .

由于无模型对话使用了两个消息框,事情变得更加复杂:

  • 您确定要删除名称吗?是的|没有

  • 名称已删除确定

可以将代码更改为工作,或者如果我转到自定义消息路由,我需要知道消息框的结果才能继续执行代码(对于方案1) .

Update 2:

我现在很困惑 . 我在父对话中添加了自定义注册消息:

afx_msg LRESULT CChristianLifeMinistryEditorDlg::OnDisplayMessage(WPARAM wParam, LPARAM lParam)
{
    return AfxMessageBox((LPCTSTR)wParam, (UINT)lParam);
}

无模式对话会像这样调用它:

iResult = ::SendMessage(GetParent()->GetSafeHwnd(), UWM_DISPLAY_MESSAGE_MSG,
    (WPARAM)strEntry.GetBuffer(_MAX_PATH), MB_YESNO | MB_ICONQUESTION);
strEntry.ReleaseBuffer();

我在消息处理程序中放置了一个断点,所以我知道它正在被正确触发 . 实际上正在显示一个消息框 .

但由于某种原因,消息框仍然显示无模式对话的核心,而不是编辑器 . 我不明白为什么?

Result!

我找到了这个话题:How to force AfxMessageBox to center on mainframe and not whatever child window that currently has focus

我调整了我的代码:

afx_msg LRESULT CChristianLifeMinistryEditorDlg::OnDisplayMessage(WPARAM wParam, LPARAM lParam)
{
    return MessageBox((LPCTSTR)wParam, NULL, (UINT)lParam);
}

现在它显示了父对话的中心 .

我很抱歉这个问题从一个方向开始,最后得到另一个方向的答案 . 我不确定我们是怎么做的?从技术上讲,对我使用GetWindow的评论似乎对我没有用 . 因此,没有答案 . 但通过改变我的设计,我已经能够防止这种情况发生 .

Premature Result

虽然消息框显示为居中,但它会影响后续代码 . 提出读取分配错误 .

但我现在想出了一个可行的解决方案:

GetParent()->EnableWindow(FALSE);
    strEntry.Format(IDS_TPL_SURE_DELETE_FROM_ASSIGN_HIST, psHist->strName);
    if (AfxMessageBox(strEntry, MB_YESNO | MB_ICONQUESTION) == IDNO)
    {
        GetParent()->EnableWindow(TRUE);
        return;
    }

我在显示消息框之前禁用父级,并在解除消息后再次启用它 . 这可以防止用户关闭主窗口 . 他们关闭了弹出消息 . 我现在必须走这条路 .

多谢你们 .