现有一登录窗口Dlg1,成功登录之后以EndDialog方式销毁窗口Dlg1并以DoModal方式弹出窗口Dlg2。问题:Dlg2是Dlg1的子窗口,父窗口销毁之后子窗口还能存在么?

解决方案 »

  1.   

    DoModal弹出,有指定父窗口为Dlg1吗?  
      

  2.   

    以DoModal方式弹出的窗口不是前一窗口的子窗口么?那什么情况下两个窗口之间建立了父子关系?
      

  3.   

    D1销毁后才起的D2,D1跟D2貌似一点关系都没吧,何来父子关系?
      

  4.   

    弹出窗口自然有父窗口,关键是定义Dlg2的代码是存在于哪里,也就是Dlg2是由那个窗口调用产生的。
    如果Dlg2在产生前,Dlg1已经销毁了,那么Dlg2的父窗口不可能是Dlg1。或者你的程序还有一个框架,
    负责产生处理各种模态对话框...希望LZ明示~
      

  5.   


    我的MFC程序是这样的,程序运行时有一个登录窗口,成功登录之后弹出主窗口;而主窗口菜单中有个菜单项“财务系统”又需要进行登录后才能使用,此时点击该菜单项弹出另一登录窗口(即上面所述Dlg1),成功登录之后才能进入“财务系统”(即上面所述Dlg2)。那么这两个窗口的关系是怎么样的呢?什么情况下两个窗口之间建立了父子关系?
      

  6.   

    在主窗口上点“财务系统”时用DoModal弹出的登陆窗口就是主窗口的儿子了
      

  7.   

    建议楼主花5分钟做一个试验。对话框工程。
    dlg1:按一个按钮弹出dlg2
    dlg2:按一个按钮后,启动Timer(5秒,5秒后用EndDialog自杀)的同时,弹出dlg3。等待。5秒后看结果。
      

  8.   

    补充一下。    爹和儿子。1)dlg2想给dlg3当爹。
    在dlg2弹出dlg3之前,让dlg2作dlg3的爹。
    CDlg3 dlg(this);
    SetTimer(1,5000,NULL);
    .....执行,观察
    2)dlg3认爹。
    在资源里,把Dlg3的属性设成 甘当儿子的"child".执行,观察----------------
    作完了试验,估计你的疑虑完全消失了。
    哈哈!
      

  9.   

    晕,还是不太明白,按照13楼兄弟说的,只有人工设置指定才能具有父子关系,其它情况的窗口不存在关系?还有11楼kok202朋友的“‘财务’跟登录窗口是兄弟关系”是为什么?
      

  10.   

    CDialog(
       UINT nIDTemplate,
       CWnd* pParentWnd = NULL 
    );
    这个构造函数默认的第二个参数为NULL,意思是main application window
    根据你的叙述,“程序运行时有一个登录窗口”,你的主程序窗口是这个登录窗口吧,那么看你的意思没有它并没有销毁,所以不会发生
      

  11.   

    要实现“先弹出登陆对话框,再弹出主对话框”的功能没那么复杂吧我在基于对话框的工程里试了一下,不知道是不是你想实现的:
    BOOL CtestApp::InitInstance()
    {
    // 如果一个运行在 Windows XP 上的应用程序清单指定要
    // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
    //则需要 InitCommonControls()。否则,将无法创建窗口。
    InitCommonControls(); CWinApp::InitInstance(); AfxEnableControlContainer(); // 标准初始化
    // 如果未使用这些功能并希望减小
    // 最终可执行文件的大小,则应移除下列
    // 不需要的特定初始化例程
    // 更改用于存储设置的注册表项
    // TODO: 应适当修改该字符串,
    // 例如修改为公司或组织名
    SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
             CNewDlg dlg1;//这个dlg1可以看作是登陆对话框,
    if(dlg1.DoModal()==IDOK)
    {//在CNewDlg中判断登陆是否成功,成功则返回IDOK,打开主对话框;否则,返回IDCANCEL,退出程序
    CtestDlg dlg;//这个dlg就是登陆后看到的主界面对话框
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
    // TODO: 在此放置处理何时用“确定”来关闭
    //对话框的代码
    }
    else if (nResponse == IDCANCEL)
    {
    // TODO: 在此放置处理何时用“取消”来关闭
    //对话框的代码
    }
    }
            //其余代码略
    }
      

  12.   

    谢谢anzheazhang朋友,我会实现“先弹出登陆对话框,再弹出主对话框”的功能。只是不明白父子窗口关系是怎么形成的,以及如何判定窗口之间的关系。
      

  13.   

    DOMODAL只是显示另外一个窗口而已。他们没有父子关系。父子关系是用Create创建时指定父窗口句柄才有的。