已经发过了,但是由于结贴太快,而问题也没有解决所以重发了,也顺便把问题描述的更清楚些。
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
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
你现在做的就是个递归的过程:a调b,b调c,c调a。解决方法就是:都在A里做不行么?为啥一定要在b里搞b1,b1里搞c,c里再搞b1。
这些都是根据用户从键盘的输入来显示不同的界面所以这是个无限的嵌套,迟早内存泄露崩溃但是我找不到好的办法解决这个问题。用PostMessage的话会出现闪屏的现象望大伙指点改如何设计这个问题呢
这个问题比较乱,我看干脆这样好了,你从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和其派生类都必须用虚析构函数。
意思是用户输完C之后,可能又去输入B,显示Bdlg,这样内存中的对话框就太多了而不是有许多对话框对话框的数量一定的,也不多,只是需要不停切换来显示
意思是用户输完C之后,可能又去输入B,显示Bdlg,这样内存中的对话框就太多了而不是有许多对话框对话框的数量一定的,也不多,只是需要不停切换来显示
然后用ShowWindow来控制可见呢?
既然你想b之后是b1,那就在A里既有b又有b1,b.DoModal返回后,根据返回的条件判断是否需要b1.DoModal不就行了,为什么一定要在b里去创建b1呢?
如果用非模态,是否可行?
非模态如何在每次显示之前改变状态呢?
在显示前给非模态对话框中成员变量赋值后,调用UpdateData(FALSE)就可以更新显示了
ADlg-B-B1
-C-C1如果是这样的话,用模态的就可以实现,因为显示C之前B和B1都已关闭不显示。
不需要显式调用EndDialog(IDOK)
|-B1
|-C
就是要等到DoModal返回,在创建下一个对话框。没必要用非模态,
B、B1、C之间的逻辑由A负责。
就那么几个界面,A可以调到所有的二级界面,所以的三级界面可以调到二级界面也可以到A,而三级界面只能通过二级界面进入无限下午就有很多对话框没有销毁掉,感觉要改变下
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)