在基于对话框的MFC里为主对话框parent_dlg创建一个非模态的子对话框child_dlg,可以是:
CChildDlg* child_dlg = new CChildDlg; /* ............1 */
child_dlg->Create(IDD_CHILDDLG,this);
child_dlg->ShowWindow(SW_SHOW);
new出来的内存空间在child_dlg销毁时需要用delete来清除。
但如果不用上面的语句1,而是在CParentDlg类里先定义一个CChildDlg类型的成员变量
Public:
CChildDlg child_dlg;
而后在主对话框的cpp里调用
child_dlg.Create(IDD_CHILDDLG,this);
child_dlg.ShowWindow(SW_SHOW);
创建出来的子对话框同样有非模态对话框的行为,可以打开时同时操作别的窗口。求教各位,
1.这样创建的对话框是非模态对话框吗?
2.销毁时需要什么特别的处理吗?
CChildDlg* child_dlg = new CChildDlg; /* ............1 */
child_dlg->Create(IDD_CHILDDLG,this);
child_dlg->ShowWindow(SW_SHOW);
new出来的内存空间在child_dlg销毁时需要用delete来清除。
但如果不用上面的语句1,而是在CParentDlg类里先定义一个CChildDlg类型的成员变量
Public:
CChildDlg child_dlg;
而后在主对话框的cpp里调用
child_dlg.Create(IDD_CHILDDLG,this);
child_dlg.ShowWindow(SW_SHOW);
创建出来的子对话框同样有非模态对话框的行为,可以打开时同时操作别的窗口。求教各位,
1.这样创建的对话框是非模态对话框吗?
2.销毁时需要什么特别的处理吗?
不需要。如果对话框内部有一些要销毁的对象,那么应该在析构函数中做相应处理,或者在WM_CLOSE的响应函数中做一些处理。
看了您的博客,您在文中提到的创建过程是
但您的ptable是new出来的,我说的是作为主对话框的成员变量,这是不是要有所不同啊?
似乎只要OnOk()或者OnCancel就能正常退出,也不会弹错。。不知道会不会有内存泄露。。
里面DestroyWindow(),不然对话框没有真的关闭
When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don't call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.
1.这样创建的对话框是非模态对话框吗?
============
当然也是非模态对话框了。
2.销毁时需要什么特别的处理吗?
========================
因为不是new来的,所以不用作什么处理,当然也不有delete的。不管是哪种方式,非模态对话框的关闭都要调用DestroyWindow才行,这一点一定要注意。