一、什么是模式对话框与非模式对话框:
简单的来说,模式对话框就是一种当子窗口未关闭时父窗口就无法被激活(也就是处于无法操作状态)的一种窗口。非模式对话框就是当子窗口未关闭时,父窗口依然能被操作的一种窗口。
二、如何创建模式对话框
首先,我们创建一个基于对话框的MFC项目,将对话框ID修改为IDD_DOCTERDLG(当然,ID你可以修改成其他你喜欢的)。然后为对话框关联一个类,我们可以将类名取为CDoctor(看个人喜好,以后我都以doctor组合)。双击确定按钮进入编辑界面,编辑一个响应事件,创建模式对话框。
![双击进入编辑](https://img-blog.csdnimg.cn/20190117185142942.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyODYxMjA4,size_16,color_FFFFFF,t_70)
![在里面编辑代码
CDoctor Doctor;
Doctor.DoModal();](https://img-blog.csdnimg.cn/20190117185422707.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyODYxMjA4,size_16,color_FFFFFF,t_70)
编译运行,点击确定按钮,我们可以发现会弹出另一个窗口,![可以发现父窗口标题栏都变为灰白色,表示不能对父窗口做任何操作](https://img-blog.csdnimg.cn/20190117190857378.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyODYxMjA4,size_16,color_FFFFFF,t_70)
三、如何创建非模式对话框
步骤同前面一样,先创建一个项目。先在主窗口头文件中引用doctor.h头文件,再在主对话框类中定义一个私有成员变量
private:
CDoctor m_Doctor;
双击确定进入编辑响应事件
m_Doctor.Create(IDD_DOCTORDLG, NULL);
m_Doctor.ShowWindow(SW_SHOW); 编译运行,我们发现可以对父窗口做操作;不过,当我们关闭子窗口后再点击确定按钮,会有报错提示![在这里插入图片描述](https://img-blog.csdnimg.cn/20190117192644649.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyODYxMjA4,size_16,color_FFFFFF,t_70)为什么会这样,原因就在于我们关闭子对话框后子对话框只是隐藏了,并没有销毁由create方法创建的对话框资源,此时对象m_Doctor已经关联了对话框,所以产生了以上的错误。那么我们如何来解决这个错误呢。我们可以用IsWindow函数先判断一下m_Doctor有没有关联对话框,我们可以将响应事件的代码编辑为
if (!IsWindow(m_Doctor.m_hWnd))
{
m_Book.Create(IDD_DOCTORDLG, NULL);
}
m_Doctor.ShowWindow(SW_SHOW);编译运行,当关闭子窗口再次点击按钮就不会报错啦!
模式对话框就不会出现这种问题,因为模式对话框只是定义了一个局部变量,当子窗口关闭之后就会调用析构函数销毁对话框资源。而非模式对话框最初定义的是一个私有成员。
如果我们将代码修改为
CDoctor Doctor;
m_ Doctor.Create(IDD_DOCTORDLG, NULL);
m_ Doctor.ShowWindow(SW_SHOW);
编译之后,我们点击确定按钮,会发现子窗口出现之后立马就消失了,这是因为函数调用完之后局部对象作用域消失,释放对话框资源,所以会出现这种情况。
今天开始学习MFC,以后会经常不定时的更新博客,喜欢编程的朋友可以关注一下我的csdn博客DOCTOR/W,也可以找我交流一下经验。我的qq
431734527 如果有幸有人加了我的话请注明一下来意,谢谢!