我如何关闭主窗口???
譬如,一个简单的对话框,点击系统"关于"菜单,会
CAboutDlg dlgAbout;
dlgAbout.DoModal();
此时dlgAbout是模态的,也就是说主窗口被禁止了接受任何键盘和鼠标输入,
但是我想关闭主窗口,而不是等dlgAbout的DoModal返回!!!!请问该如何作?
我已经试过了,给主窗口发WM_CLOSE消息,此时主窗口确实不见了,但是那个关于对话框还在!
BOOL CAboutDlg::OnInitDialog() 
{
CDialog::OnInitDialog();
SetTimer(1,5000,NULL);
return TRUE;  }void CAboutDlg::OnTimer(UINT nIDEvent) 
{
::SendMessage(GetParent()->m_hWnd,WM_CLOSE,0,0);
CDialog::OnTimer(nIDEvent);
}

解决方案 »

  1.   

    AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0);
    PostQuitMessage(0);
      

  2.   

    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    改为:
    CAboutDlg *dlgAbout=new CAboutDlg;
    CAboutDlg->Create(IDD_ABOUTBOX);
    CAboutDlg->ShowWindow(SW_SHOW);不过我不明白你的意思,
    你是指打开这个对话框后把主窗口关闭?
    如果主窗口关闭了,
    这个对话框也会相应的关闭了.
      

  3.   

    楼主是想主对话框关闭,同时About对话框也要关闭。由于About对话框的弹出是主对话框引起的,所以我认为About对话框的关闭应该由主对话框来完成。在主对话框的退出函数中应该关闭About对话框
      

  4.   

    大家还没有明白我的意思!!!我的程序的主窗口是DoModal出来的,
    然后在这个窗口里面我creat了好多非模态的对话框,
    现在然后那些非模态的对话框又各自DoModal了各自的模态对话框,
    现在我的问题是:我想关闭整个程序,就像QQ一样的点击托盘图标,向主窗口(就是最开始DoModal)的那个窗口发一个命令,把屏幕上所有属于整个进程的对话框(不管非模态还是模态的,只要存在的)全部统统关闭!!
    可是我现在如果向主窗口发WM_CLOSE消息的话,主窗口消失,其余的被creat的窗口也消失,但是未读有DoMOdal的creat的窗口还存在!!!主窗口 ----A
    A窗口Creat了A1,A2,A3三个子窗口,
    A1窗口Domodal了一个窗口,A2和A3没有
    现在我如何才能用一个命令让A系列全部关闭???
    【注意】不要告诉我必须把DoModal的窗口手动关闭再关闭别的哦~~~~~呵呵
      

  5.   

    : happyparrot(快乐鹦鹉) ( 感谢你的代码,呵呵,你给主窗口发了一个CLOSE的消息,同时也退出了消息循环,随意运行你的代码时候---->>主窗口不见了,子窗口还在,不过不能接受任何的消息响应了.
    我就是需要知道如何【从外部】关闭一个DoModal出来的对话框.
      

  6.   

    1.创建CAboutDlg无模式对话框由主对话框创建,关闭主对话框的时候判断CAboutDlg对话框释放标志。如标志为真,则释放CAboutDlg对话框。
    2.CAboutDlg关闭时发送消息给主对话框,通知主对话框CAboutDlg对话框已关闭,参数传送标志为假。
      

  7.   

    我递归查找也出错??void CTestctrlDlg::OnClose() 
    {
    CWnd *pWnd = GetWindow(GW_CHILD);
    while(pWnd)
    {
    CWnd *pWndTemp = pWnd;
    pWndTemp->SendMessage(WM_CLOSE);
    pWnd = pWnd->GetWindow(GW_HWNDNEXT);
    }
    CDialog::OnClose();
    }
      

  8.   

    : lixiaosan(小三)晕,我现在作一个跟QQ一样的软件,各种对话框不下100个!
    我难道要维护每一个new 或者构造的对话框???
    换一种想法,我遍历所有本进程的窗口该怎么作???
      

  9.   

    : zhucde
    如果主窗口关闭了,
    这个对话框也会相应的关闭了.
    ======================
    请你自己动手尝试一下,好吗?
      

  10.   

    创建无模式对话框的时候,父窗口指针指定为你主窗口的指针,不要指定为NULL
      

  11.   

    : gracezhu(eutom) 谢谢你的回复,不过还是不行!呵呵
      

  12.   

    :lixiaosan(小三) 谢谢你,你比那些动不动就为了抢分而随意回答别人的的人好多了,这是真正对待问题的态度,没有浮躁.我们可以探讨几种可能吗?1,管理所有的窗口,用你的思路
    2,遍历所有次进程的窗口,然后循环CLOSE
    3.....
      

  13.   

    不管了,遍历所有桌面窗口,只要父窗口是我的程序的,就CLOSE
      

  14.   

    我要修改派生CDialog,自己添加一个标志!!
    然后把我的程序里面的是从CDialog继承下来的全部替换!!!
      

  15.   

    AfxGetMainWnd()->DestroyWindow();
    我试了
    可以的
      

  16.   

    ---------------------------
    技术上可行
    符合你的要求吗?
    如果不明白
    请给我发短消息
    请附: 帖子的地址
    或在
    http://www.338888.com/VCShare/Default.asp
    上提问
      

  17.   

    PostMessage

    SendMessage都不行
      

  18.   

    exit(0); 
    AfxAbort();
    一了百了了。试试:AfxGetMainWnd() ->EnableWindow(true);
    再点主对话框的关闭按钮。我也没试过。呵呵
      

  19.   

    下面是测试的代码,m_dlg是一个无模式对话框在About前已经弹出void CAboutDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    this->PostMessage(WM_CLOSE,0,0);
    ::PostMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_CLOSE,0,0);
    }void CDlgScrDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    m_dlg.Create(IDD_DIALOG1);
    m_dlg.ShowWindow(SW_SHOW);
    }
      

  20.   

    如果父窗口不是住窗口的话也好办
    void CAboutDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    this->PostMessage(WM_CLOSE,0,0);
    CWnd *pWnd=this;
    while((pWnd=pWnd->GetParent())!=NULL)
    {
    ::PostMessage(pWnd->GetSafeHwnd(),WM_CLOSE,0,0);
    }
    }
      

  21.   

    上述代码已经在多线程DoModal多个对话框、A创建A1 B1,B1 Create C, A1 DoModal D,D Create E,D结束的过程中测试没问题,hoho
      

  22.   

    : he_zhidan(何志丹:风云伐日) 
    你的AfxGetMainWnd()->DestroyWindow();
    在我的测试例子中可用.: enoloo(努力COM
    你的Exit(0);也行.但是你们两个的我还得严格的测试内存泄漏问题.
    : bluebohe(薄荷) 
    你还是没有看明白我的问题,我并不需要主动去点击我DoModal出来的对话框!!!
      

  23.   

    你可以在任何地方加这些代码,只要有这些代码就能关闭你的窗口! this->PostMessage(WM_CLOSE,0,0);
    CWnd *pWnd=this;
    while((pWnd=pWnd->GetParent())!=NULL)
    {
    ::PostMessage(pWnd->GetSafeHwnd(),WM_CLOSE,0,0);
    }
      

  24.   

    我的程序为了不在运行的时候现实任务栏图标,所以是这样设置的.BOOL CMDMainApp::InitInstance()
    {
    AfxInitRichEdit();
    AfxEnableControlContainer();
    #ifdef _AFXDLL
    Enable3dControls(); // Call this when using MFC in a shared DLL
    #else
    Enable3dControlsStatic(); // Call this when linking to MFC statically
    #endif CDlgHide dlgparent;
    dlgparent.Create(IDD_DIALOG_HIDE);
    dlgparent.ShowWindow(SW_HIDE);
    m_pHideParent = &dlgparent;

    CMDMainDlg dlg(&dlgparent);
    m_pMainWnd = &dlg; dlg.DoModal();

    dlgparent.DestroyWindow();
    return FALSE;
    }
    我在CMDMainDlg 里面creat了一个聊天的窗口DLgChat(父窗口是m_pHideParent而不是m_pMainWnd),
    而在这个DlgChat里面我DoModal了一个群组消息的对话框,
    群组消息对话框的父窗口是DlgChat,
    我有一个托盘图标,消息处理函数在CMDMainDLg里面,我点击托盘的"退出"时候往CMDMainDlg发一个消息,想把此时的CMDMainDlg和CDlgChat还有在CDlgChat里面DoModal的对话框全部关掉!而现在是把CMDMainDLg关掉了,而CDlgChat和那个DoModal的群发消失对话框还在!
      

  25.   

    我已经解决!!!并且没有内存泄漏!
    Exit(0)有内存泄漏!void CMDMainDlg::OnButtonClose()
    {
    AfxGetMainWnd()->DestroyWindow();
    ((CMDMainApp*)AfxGetApp())->m_pHideParent->DestroyWindow();
    }其实我原来是给那个m_pHideParent发了一个WM_CLOSE过的,但是没有发Destory消息,我觉的那样太暴力了.感谢楼上的
    : he_zhidan(何志丹:风云伐日) 
    : enoloo(努力COM
    : bluebohe(薄荷) 
    : lixiaosan(小三)
      

  26.   

    : bluebohe(薄荷) ( ) 再次感谢你,但是你的意思是找到那个窗口在发WM_CLOSE的消息,
    我并不需要知道每一个打开的窗口,我只需要作的是把属于我的每个对话框给安全的CLOSE,所以我用我的上面办法了,其实回过头来我走了很大弯路.
      

  27.   

    晕,你都解决了啊。早上开会,给你说晚了。昨天晚上试了一下,我也是用楼上AfxGetMainWnd()->DestroyWindow();解决问题的。不过写晚了。。5555