如何从外面关闭CDialog派生的窗口?

时间:2014-05-21 21:55:37

标签: c++ windows mfc dialog modal-dialog

说,我从上下文菜单中创建一个对话窗口,可以通过右键单击我的应用程序的托盘图标来调用该窗口:

CDialogDerivedClass dlg;
dlg.DoModal();

如果用户再次右键单击我的上下文菜单并选择另一个命令,我需要关闭该对话框窗口并显示另一个。我认为只需将WM_CLOSE发送到第一个窗口就可以了:

dlg.SendMessage(WM_CLOSE);

但显然它在MFC类中混淆了一些东西,因为那时对话框的CDialogDerivedClass :: OnDestroy()方法从未被调用过。这只发生在我的应用程序或其进程退出时(稍后)。

所以我很好奇,你如何从外部(来自同一/主线程)关闭MFC的CDialog派生类?

4 个答案:

答案 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。正如官方文档所述:

  • the sendmessage()函数调用指定窗口的窗口过程,直到该窗口过程处理完该消息后才返回。
  • the postmessage()函数仅将消息放置(发布)在与创建指定窗口的线程相关联的消息队列中,而无需等待线程处理消息就返回。
简而言之,首先要保存手柄;秒,将WM_CLOSE(或某些类型的消息)传递到该窗口。

答案 3 :(得分:-1)

尝试

的EndDialog(IDCANCEL); 要么 的EndDialog(IDOK);

希望它有所帮助,

维尼