基于对话框的编程之模态与非模态


一、效果图

二、模态对话框和非模态对话框区别

程序运行过程中,若出现了模态对话框,则主窗口无法继续发送消息,直到模态对话框关闭;若出现了模态对话框,主窗口仍可以继续发送消息。

三、具体实现步骤

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);
}
MFC