MFC模态与非模态对话框_初始化

模态:在该窗口弹出后,会阻塞应用程序的窗口,使其不可操作;

非模态:不会阻塞应用程序的窗口,两者可独立操作 

模态对话框

功能:点击提示框按钮弹出新建的对话框

1.导入新对话框类

MFC模态与非模态对话框_初始化_02

 

 

个人认为最好在主对话框的头文件中导入

MFC模态与非模态对话框_应用程序_03

 

  

2. 

void CmfctestDlg::OnBnClickedButton1() //提示框按钮
{

CmyDialog dlg;//创建新建对话框类的实例
dlg.DoModal();//弹出对话框--模态


}

 

示例工程下载:链接:https://pan.baidu.com/s/1UVVZoD0doh6jL18rQPuQQQ       提取码:6666      

 

非模态对话框

容易犯的错误 

MFC模态与非模态对话框_应用程序_04

 

 创建的对话框会一闪而过:原因dlg是局部变量(在栈中申请的内存),对话框显示后,按钮函数OnBnClickedButton1马上结束,dlg被销毁了

正确方法

dlg对话框在堆中申请内存即可

方法一:全局变量

MFC模态与非模态对话框_模态_05

 

 

MFC模态与非模态对话框_模态_06

到这一步:运行程序,第一次点击运行 正常,关闭后 第二次点击会 弹出错误对话框

原因:每次单击都会调用 Create函数,该函数是初始化函数,会创建一个非模态对话框(一个对象只对应一个对话框,即一个对象只初始化一次),多次调用 Create 函数会导致程序崩掉

解决办法把 Create函数 放到主窗口类的初始化函数中,就不会重复创建

MFC模态与非模态对话框_模态_07

 

 

MFC模态与非模态对话框_初始化_08

 

 示例工程下载:

链接:https://pan.baidu.com/s/1aiUGSmRxTcfUR8uidTNKkw        提取码:6666    

  

 

方法二:new

 

MFC模态与非模态对话框_初始化_09

 

 

MFC模态与非模态对话框_应用程序_10

 

出现的问题与全局变量类似

 

 

方法三:malloc