Mfc 如何强制关闭无模式对话?

Mfc 如何强制关闭无模式对话?,mfc,Mfc,我在这里看到了一个类似的问题: 以下是我结束无模式对话的方式: void CChristianLifeMinistryEditorDlg::OnDestroy() { if (m_pAssignHistoryDlg != NULL) { delete m_pAssignHistoryDlg; m_pAssignHistoryDlg = NULL; } CDialogEx::OnDestroy(); } afx_msg LRES

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

以下是我结束无模式对话的方式:

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

    CDialogEx::OnDestroy();
}
afx_msg LRESULT CChristianLifeMinistryEditorDlg::OnDisplayMessage(WPARAM wParam, LPARAM lParam)
{
    return AfxMessageBox((LPCTSTR)wParam, (UINT)lParam);
}
直到今天,这一直是足够的。我发现(偶然引用)如果无模式对话框上有一个消息框,用户打开并关闭父对话框,则无模式对话框将一直显示在屏幕上,直到您关闭消息框为止

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

有可能迫使它关闭吗?或者,当屏幕上出现无模式弹出窗口时,我是否应该以某种方式阻止关闭我的家长对话

正确的做法是什么

多谢各位

更新:

我试过这个:

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)

    更新2:

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

    void CChristianLifeMinistryEditorDlg::OnDestroy()
    {
        if (m_pAssignHistoryDlg != NULL)
        {
            delete m_pAssignHistoryDlg;
            m_pAssignHistoryDlg = NULL;
        }
    
        CDialogEx::OnDestroy();
    }
    
    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();
    
    我在消息处理程序中放置了一个断点,因此我知道它被正确触发。事实上,正在显示一个消息框

    但出于某种原因,消息框仍然显示非模态对话框的中心,而不是编辑器。我不明白为什么

    结果

    我发现这个话题:

    我调整了我的代码:

    afx_msg LRESULT CChristianLifeMinistryEditorDlg::OnDisplayMessage(WPARAM wParam, LPARAM lParam)
    {
        return MessageBox((LPCTSTR)wParam, NULL, (UINT)lParam);
    }
    
    现在它显示了家长对话的中心

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

    过早的结果

    消息框居中显示时,会影响后续代码。出现读取分配错误

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

        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;
        }
    
    我在显示消息框之前禁用父级,并在消息框关闭后再次启用它。这将防止用户关闭主窗口。他们关闭了弹出的消息。我现在必须走这条路


    谢谢大家。

    当窗口仍然显示模式对话框(您的消息框)时,您不能关闭该窗口。您可以调用passing
    GW_ENABLEDPOPUP
    ,查看是否有任何消息框窗口打开,然后首先关闭这些窗口。或者简单地使用这些信息来防止所有者(部分)破坏窗口层次结构。我认为这里有一个设计缺陷:无模式对话框不应该阻止其父对话框,但如果有模式弹出窗口(消息框),您确实希望阻止它。也许你不应该在一个非模态的父母身上有一个模态的孩子?好吧,我确实想要一个非模态的对话。当用户单击编辑器上的控件时,无模式对话框将使用历史数据动态更新。用户可以单击此窗口中的条目,该条目将自动输入到具有焦点的编辑器控件中。因此,使用无模式对话是正确的做法。但是,有时他们想从历史记录列表中删除一个名称,这是在历史记录窗口中完成的,我通过弹出消息向用户提供反馈。也许我应该向家长发布一条注册用户消息,让家长显示消息框。@IInspectable,哪一个最好?执行该测试并关闭弹出窗口,或者,更改应用程序以通过自定义消息编辑器窗口显示弹出窗口。