1.模态与非模态对话框
模态对话框创建
CTestDlg dlg;
dlg.DoModal();
非模态对话框的创建
CTestDlg *pDlg =new CTestDlg();
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);
这里第一个参数是对话框资源的ID和或话框模板的名称。
第二个参数是对话框的父窗口。
这里需要注意以下几点
1. Create创建非模态对话框要用ShowWindow才会显示出来。
2. 这里用指针是因为要在堆上分配内存,在堆上分配内存是整个程序的生命周期一致的。这样做又会遇到一个问题,当这个函数体结速时,生命周期结束了,指针变量被销毁了。所指向的内存丢失了。
解决方法有两种:
一. 将指针变量声明为类的成员变量。在类的析构函数里,用delete函数释方指向的那块内存。
二. 在CTestDlg中重载PostNcDestory函数,释放this指针指向的内存,delete this;
3. 如果用的是局部变量,在函数结束时会销毁局部变量。CTestDlg 被销毁了当然不会显示出来。还有一种解决方法是声明为类的成员变量。这样生命周期跟类一致。
4. 为什以模态对话框的可以用局部变量呢?这是因为模态对话框的实现机制,在弹出对话框后,创建模态对话框的函数被中止了,模态对话框关闭后,才继续执行创建函数体其它部份。
5. 对于非模态对话框,如果有ID值为IDOK或IDCANCEL的按钮就必须重写OnOK和OnCancel函数,在重写的函数中调用DestoryWindow函数销毁销口。