如何创建MFC模式对话框与非模式对话框

一、什么是模式对话框与非模式对话框:

    简单的来说,模式对话框就是一种当子窗口未关闭时父窗口就无法被激活(也就是处于无法操作状态)的一种窗口。非模式对话框就是当子窗口未关闭时,父窗口依然能被操作的一种窗口。

二、如何创建模式对话框

  首先,我们创建一个基于对话框的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 如果有幸有人加了我的话请注明一下来意,谢谢!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值