From: http://www.jizhuomi.com/school/c/160.html

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

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

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

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

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

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

二.模态对话框是怎样弹出的

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

大家打开Addition.cpp文件,可以看到CAdditionApp类有个InitInstance()函数,在MFC应用程序框架分析中提到过此函数,不过那是单文档应用程序App类中的,函数体不太相同,但都是进行App类实例的初始化工作。

InitInstance()函数的后半部分有一段代码就是定义对话框对象并弹出对话框的,鸡啄米下面给出这段代码并加以注释:

1

2

3

4

5

6

7

8

9

10

11

12

13

CAdditionDlg dlg;        // 定义对话框类CAdditionDlg的对象dlg

m_pMainWnd = &dlg;       // 将dlg设为主窗口

INT_PTR nResponse = dlg.DoModal();   // 弹出对话框dlg,并将DoModal函数的返回值(退出时点击按钮的ID)赋值给nResponse

if (nResponse == IDOK)               // 判断返回值是否为OK按钮(其ID为IDOK,鸡啄米已经将它删除)

{

// TODO: Place code here to handle when the dialog is

//  dismissed with OK

}

else if (nResponse == IDCANCEL)      // 判断返回值是否为Cancel按钮(其ID为IDCANCEL,鸡啄米将它的Caption改为了"退出")

{

// TODO: Place code here to handle when the dialog is

//  dismissed with Cancel

}

弹出对话框比较关键的一个函数,就是对话框类的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改为"您确定要进行加法计算吗?",接下来修改OK按钮的Caption为"确定",Cancel按钮的Caption为"取消",最后调整各个控件的位置和对话框的大小。最终的对话框模板如下图:

2.根据"创建对话框类和添加控件变量"中创建对话框类的方法,在对话框模板上点右键选择"Add Class...",弹出添加类的对话框,设置"Class name"为CTipDlg,点"OK"。在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()函数修改后如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

void CAdditionDlg::OnBnClickedAddButton()

{

// TODO: Add your control notification handler code here

INT_PTR nRes;             // 用于保存DoModal函数的返回值

CTipDlg tipDlg;           // 构造对话框类CTipDlg的实例

nRes = tipDlg.DoModal();  // 弹出对话框

if (IDCANCEL == nRes)     // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行

return;

// 将各控件中的数据保存到相应的变量

UpdateData(TRUE);

// 将被加数和加数的加和赋值给m_editSum

m_editSum = m_editSummand + m_editAddend;

// 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值

UpdateData(FALSE);

}

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

到此,大家对于模态对话框的基本使用方法应该掌握了吧。希望大家继续关注鸡啄米的MFC教程,我们共同进步。

最新文章

  1. web方式修改svn密码
  2. Objective-C 装饰模式--简单介绍和使用
  3. C#设计模式-装饰者模式
  4. ASP.NET MVC 提示there was error getting the type的解决方法
  5. vb- ----之常用函数
  6. BigInteger类型的解析_超详细解析
  7. C++语言-03-类与对象
  8. memcached的安装
  9. 再谈PHP、Python与Ruby
  10. bzoj4652 [Noi2016]循环之美
  11. python跨网段遍历枚举IP地址(转)
  12. Allegro PCB Design GXL (legacy) 设置十字大光标
  13. 如何将本地大文件通过终端上传到linux服务器
  14. Cron 表达式
  15. Spring MVC 请求处理方法
  16. linux密码暴力破解机
  17. linux基础命令---df
  18. 编写 Target 检测 MSBuild / dotnet build 此次编译是否是差量编译
  19. Linux内核优化(未注释)
  20. LOJ2609. NOIP2013 火柴排队 【树状数组】

热门文章

  1. oracle定时任务的编写及查看删除
  2. Revit API遍历全部风管,找到与风管相关的墙开洞
  3. Lucene 3.0 输出相似度
  4. canvas使用3
  5. Lombok使用详解(转)
  6. Java中使用正则表达式获取网页中所有图片的路径
  7. mysql error You must reset your password using ALTER USER statement before executing this statement.
  8. Android使用代码模拟HOME键的功能
  9. 详细解读LruCache类
  10. [Android Pro] AndroidStudio IDE界面插件开发(进阶篇之Action机制)