说,我从上下文菜单中创建一个对话窗口,可以通过右键单击我的应用程序的托盘图标来调用该窗口:
CDialogDerivedClass dlg;
dlg.DoModal();
如果用户再次右键单击我的上下文菜单并选择另一个命令,我需要关闭该对话框窗口并显示另一个。我认为只需将WM_CLOSE发送到第一个窗口就可以了:
dlg.SendMessage(WM_CLOSE);
但显然它在MFC类中混淆了一些东西,因为那时对话框的CDialogDerivedClass :: OnDestroy()方法从未被调用过。这只发生在我的应用程序或其进程退出时(稍后)。
所以我很好奇,你如何从外部(来自同一/主线程)关闭MFC的CDialog派生类?
答案 0 :(得分:0)
我想你可以模拟点击取消:::EndDialog(dlg.m_hWnd, IDCANCEL);
答案 1 :(得分:0)
对我对你的问题的误解感到抱歉。
您可以为要从主类中的系统托盘菜单启动的每个对话创建一个指针:
在主类标题中添加指向对话框的指针:
CDialog1 *m_pDialog1;
CDialog2 *m_pDialog2;
不要忘记在主类构造函数中将它们初始化为NULL。
添加MAP以处理菜单选项:
ON_COMMAND(ID_DIALOG1, &CSystemTrayApp::OnDialog1)
ON_COMMAND(ID_DIALOG2, &CSystemTrayApp::OnDialog2)
他们,打电话给#34; EndDialog"对于任何已开始的对话,使用指针,在开始新对话之前:
void CSystemTrayApp::OnDialog1()
{
if ( m_pDialog2 != NULL && m_pDialog2->GetSafeHwnd() )
{
m_pDialog2->EndDialog(IDCANCEL);
delete m_pDialog2;
m_pDialog2 = NULL;
}
m_pDialog1 = new CDialog1();
m_pDialog1->DoModal();
}
void CSystemTrayApp::OnDialog2()
{
if ( m_pDialog1 != NULL && m_pDialog1->GetSafeHwnd() )
{
m_pDialog1->EndDialog(IDCANCEL);
delete m_pDialog1;
m_pDialog1 = NULL;
}
m_pDialog2 = new CDialog2();
m_pDialog2->DoModal();
}
在主类的descructor上,根据需要清理对话:
if ( m_pDialog1 != NULL ) delete m_pDialog1;
if ( m_pDialog2 != NULL ) delete m_pDialog2;
答案 2 :(得分:0)
通过某个窗口的句柄,应用程序可以向该窗口发送/发送任何类型的消息。因此,这里提供了您可能需要尝试的可能解决方案。
简单来说,当创建第一个无模式窗口(一个调用DoModel())时,然后将其句柄另存为全局变量或另一个Static变量。当您想关闭无模式时,可以向该窗口发布消息WM_CLOSE。
重要的是传递WM_CLOSE消息的API。正如官方文档所述:
答案 3 :(得分:-1)
尝试
的EndDialog(IDCANCEL); 要么 的EndDialog(IDOK);
希望它有所帮助,
维尼