已经发过了,但是由于结贴太快,而问题也没有解决所以重发了,也顺便把问题描述的更清楚些。
http://topic.csdn.net/u/20081105/00/77484489-31de-4fff-8caf-4a983342f2df.html?1718813239
我我采用模态对话框来设计界面,ADlg为主对话框,主界面 
下面有二级界面BDlg、CDlg 
还有三级界面B1Dlg、C2Dlg 目前我在ADlg中 通过 BDlg  bdlg; bdlg.DoModal();来显示B界面 在BDlg中通过EndDialog(IDOK);B1Dlg b1dlg; b1dlg.DoModal();销毁BDlg,显示B1界面 在B1Dlg中通过EndDialog(IDOK);CDlg cdlg; cdlg.DoModal();销毁B1Dlg,显示C界面 这只是其中的几个切换,可能到C后又要Bdlg对话,可能还要继续。当对话框切换少的时候,不会有问题。但是当切换多了,所有的资源都没有释放掉,估计会有问题了。我总感觉EndDialog(IDOK)之后内存并没有释放,如果多调用些界面,内存可能会溢出。不知我的猜测是否正确?如果这么做内存会溢出,那么该如何解决这个问题呢? 谢谢了!分不多了O(∩_∩)O

解决方案 »

  1.   

    EndDialog,然后DoModal,实际上你前一dialog还没销毁呢。
    你现在做的就是个递归的过程:a调b,b调c,c调a。解决方法就是:都在A里做不行么?为啥一定要在b里搞b1,b1里搞c,c里再搞b1。
      

  2.   

    确实是一个递归调用的过程
    这些都是根据用户从键盘的输入来显示不同的界面所以这是个无限的嵌套,迟早内存泄露崩溃但是我找不到好的办法解决这个问题。用PostMessage的话会出现闪屏的现象望大伙指点改如何设计这个问题呢
      

  3.   

    主要是不太清楚你的界面逻辑,按我理解,是始终存在一个主对话框,另外有多个子对话框,但子对话框不会同时存在多个。所以我的意思是:所有子对话框都由主对话框来显示,根据各个DoModal的返回值来决定下一步执行什么,DoModal的返回值是有EndDialog的参数指定的。
      

  4.   

    一个主对话框,其他都是子对话框,A主对话框中输入输入B,响应B显示DoModalB子对话框,而在B中根据用户的键盘输入C需要DoModal显示C子对话框,如果这时根据B的返回在A中画C,那如果用户继续输入下去,就没有函数处理了。我的界面显示都是在PreTranslateMessage()中处理我感觉我的设计有问题,但又找不到好的方法
      

  5.   

    还是没有完全清楚,“用户继续输入下去”要如何理解?
    这个问题比较乱,我看干脆这样好了,你从CDialog派生一个类CChildDlg,作为所有子对话框的基类,其中定义一个CChildDlg* m_NextDlg,在子对话框中,如果要显示新对话框,就先用new构造新对话框(例如new CDialogC),并把指针赋给该变量,否则把该变量赋值为NULL,然后EndDialog。在主对话框中:
    CChildDlg* nextDlg = new CDialogB;
    while(nextDlg != NULL)
    {
        CChildDlg* dlg = nextDlg;
        dlg->DoModal();
        nextDlg = dlg->m_NextDlg;
        delete dlg;
    }
    另外注意,CChildDlg和其派生类都必须用虚析构函数。
      

  6.   

    再补充一句,可以试试用EndDialog的参数返回用new新构造的对话框对象指针,如果这样可以,就不用派生CChildDlg类了。
      

  7.   

    ”用户继续输入下去“
    意思是用户输完C之后,可能又去输入B,显示Bdlg,这样内存中的对话框就太多了而不是有许多对话框对话框的数量一定的,也不多,只是需要不停切换来显示
      

  8.   

    ”用户继续输入下去“
    意思是用户输完C之后,可能又去输入B,显示Bdlg,这样内存中的对话框就太多了而不是有许多对话框对话框的数量一定的,也不多,只是需要不停切换来显示
      

  9.   

    那么你能不能先把所有对话框都创建出来
    然后用ShowWindow来控制可见呢?
      

  10.   

    为什么一定要递归呢?
    既然你想b之后是b1,那就在A里既有b又有b1,b.DoModal返回后,根据返回的条件判断是否需要b1.DoModal不就行了,为什么一定要在b里去创建b1呢?
      

  11.   

    DoModal不返回,下一个对话框也无法创建啊
    如果用非模态,是否可行?
    非模态如何在每次显示之前改变状态呢?
      

  12.   

    非模态可以的
    在显示前给非模态对话框中成员变量赋值后,调用UpdateData(FALSE)就可以更新显示了
      

  13.   

    不知道是不是这种结构
    ADlg-B-B1
        -C-C1如果是这样的话,用模态的就可以实现,因为显示C之前B和B1都已关闭不显示。
    不需要显式调用EndDialog(IDOK)
      

  14.   

    A---B
      |-B1
      |-C
    就是要等到DoModal返回,在创建下一个对话框。没必要用非模态,
    B、B1、C之间的逻辑由A负责。
      

  15.   

    A-B-B1-C-C1-D-B-C-C1-D-D1……可能会无限继续下去的
    就那么几个界面,A可以调到所有的二级界面,所以的三级界面可以调到二级界面也可以到A,而三级界面只能通过二级界面进入无限下午就有很多对话框没有销毁掉,感觉要改变下
      

  16.   

    我在5楼提的方法是,当需要显示新对话框时,就用new来构造,然后EndDialog将指针返回给主窗口,由主窗口来显示,如果没有构造新对话框,主窗口的这个循环就结束了,所有对话框在DoModal完成后就都销毁了,没有问题。
      

  17.   

    感觉LZ都没看大家的回帖。LZ要仔细看大家的回帖,不要死钻自己的牛角尖。你也说过自己没思路,那就放弃自己的思路,看看别人的思路。A-B-B1-C-C1-D-B-C-C1-D-D1
    A
    A显示(创建)B,B结束后返回一个值,告诉A下一个显示B1。
    A显示(创建)B1,B1结束后返回一个值,告诉A下一个显示C。
    A显示(创建)C,C结束后返回一个值,告诉A下一个显示C1。
    A显示(创建)C1,C1结束后返回一个值,告诉A下一个显示D。
    A显示(创建)D,D结束后返回一个值,告诉A下一个显示B。
    剩下的我就不用写了吧。next = B;
    do {
        switch(next) {
        case B: { DlgB b; next = b.DoModal(); break; }
        case B1: { DlgB1 b1; next = b1.DoModal(); break; }
        ...
        }
    }while(next = quit)