MFC编程入门之十一(对话框:模态对话框及其弹出过程)

  加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有了些解了,有个好的开始对于以后的学习大有裨益。趁热打铁,这一节讲讲什么是对话框和非模态对话框,以及模态对话框怎样弹出。

一、模态对话框和非模态对话框

  Windows对话框分为两类:模态对话框和非模态对话框。

  模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。

  非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等。

  大家对Windows系统很了解,相信这两种对话框应该都遇到过。之前的假发计算器对话框其实就是模态对话框。

二、模态对话框是怎么弹出的

  毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚。下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出她,这样大家实践以后就能更灵活的使用模态对话框了。

  大家打开Addition.cpp文件,可以看到CAdditionApp类有个InitInstance()函数,是进行App类实例的初始化工作。InitInstance()函数的后半部分有一段代码就是定义对话框对象并弹出对话框的,下面给出这段代码并加以注释:

MFC编程入门之十一(对话框:模态对话框及其弹出过程)

  弹出对话框比较关键的一个函数,就是对话框类的DoModal()函数。CDialog::DoModal()函数的原型为:

  virtual INT_PTR DoModal();

  返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nResult参数值。如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。

  调用了它对话框就会弹出,返回值是退出对话框时所点的按钮的ID,比如,我们点了“退出”按钮,那么DoModal返回值为IDCANCEL。

三、添加一个新对话框并弹出它

  再为加法计算器程序添加一个对话框,以在计算之前询问用户是否确定要进行计算。

  1、在Resource View中的"Dialog"上点击右键选择"Insert Dialog",创建一个新的对话模板,修改其ID为IDD_TIP_DIALOG,Caption改为“提示”,然后参考“为对话框添加控件”中所讲,在对话框模板上添加一个静态文本框(static text),Caption改为“您确定要进行加法计算吗?”,调整对话框大小和控件的位置,最终的对话框模板如下图:

MFC编程入门之十一(对话框:模态对话框及其弹出过程)

  2、根据“创建对话框类和添加控件变量”中创建对话框类的方法,在对话框模板上点击右键选择“添加类...”,弹出添加类的对话框,设置“类名”为"CTipDlg",点击“完成”。在Solution Explorer中可以看到生成CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。

  3、我们要在点“计算”按钮后弹出此对话框,那么就要在“计算”按钮的消息处理函数OnBnClickedAddButton()中访问提示对话框类,所以为了访问CTipDlg类,在AdditionDlg.cpp中包含CTipDlg的头文件:#include "TipDlg.h"。

  4、修改OnBnClickedAddButton()的函数体,在所有代码前,构造CTipDlg类的对象tipDlg,并通过语句tipDlg.DoModal();弹出对话框,最后判断DoModal()函数的返回值是IDOK还是IDCANCEL来确定是否继续进行计算。OnBnClickedAddButton()函数修改后如下:

C++代码:

MFC编程入门之十一(对话框:模态对话框及其弹出过程)

    5、测试。编译运行程序后,在对话框上输入被加数和加数,点“计算”,弹出提示对话框询问是否进行计算,如果选择“确定”,则提示对话框退出,并在住对话框显示被加数和加数的和,而如果选择“取消”,则提示对话框也会退出,但主对话框显示的和不变,即没有进行加法计算。