基于对话框的编程之模态与非模态
一、效果图
二、模态对话框和非模态对话框区别
程序运行过程中,若出现了模态对话框,则主窗口无法继续发送消息,直到模态对话框关闭;若出现了模态对话框,主窗口仍可以继续发送消息。
三、具体实现步骤
1、新建一个MFC应用程序,命名为01 CDialog
2、在设置应用程序类型时,选择基于对话框的,其他默认设置
3、运行程序,初始效果如下
4、查看类视图,我们可以看到CMy01CDialogApp和CMy01CDialogDIg两个类,其中App类继承于CWinApp,里面的InitInstance方法是程序入口,DIg类继承于CDialogEx
5、在资源视图里面打开对话框
在源文件夹下有一个.rc文件,双击后就能打开资源视图,在Dialog下,找到我们要做修改的对话框IDD_MY01CDIALOG_DIALOG
6、修改对话框的标题
按Ctrl+A键,全选,然后按Delete键删除对话框里面的初始内容
右键属性,修改Caption属性为对话框
7、新增按钮
找到工具箱,找到Button,拖拽到对话框内
右键属性,修改按钮的名字为模态对话框
再新增一个按钮,命名为非模态对话框,效果如下:
8、新增对话框
找到资源视图,Dialog右键点击Insert Dialog
对新增的对话框右键属性,修改ID为IDD_EXEC
添加一个按钮,命名为模态弹出了
9、将新建对话框关联到一个类
在对话框内的空白处右键,点击Add Class..,类名命名为CDIgExec
10、添加点击事件(三种方法)
- 按钮处右键属性,点击Control Events(闪电图标),找到BN_CLICKED,在下拉框中选择
OnBnClickedButton1
- 按钮右键选择Add Event Handler..
- 直接双击按钮(推荐使用)
11、编辑点击事件
//模态对话框按钮的点击事件 void CMy01CDialogDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here //弹出模态对话框 CDlgExec dlg; dlg.DoModal(); }
将头文件包含进来
运行效果
12、为非模态对话框添加类(CDIgShow)和点击事件
13、在.h文件中声明非模态对话框对象
14、将Create事件写到OnInitDialog()事件中
15、显示非模态对话框
//非模态对话框按钮的点击事件 void CMy01CDialogDlg::OnBnClickedButton2() { // TODO: Add your control notification handler code here //非模态对话框 //CDlgShow dlg; //创建 //dlg.Create(IDD_SHOW);//创建窗口只能创建一次,多次就会崩掉 //显示 dlg.ShowWindow(SW_SHOWNORMAL); }