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();
}
它不起作用。当我调试时,它拒绝处理该调用等,直到我自己关闭了弹出消息框
由于无模式对话使用了两个消息框,事情变得更加复杂:
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,哪一个最好?执行该测试并关闭弹出窗口,或者,更改应用程序以通过自定义消息编辑器窗口显示弹出窗口。