上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示。

鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换。鸡啄米会将上一讲中创建的Tip模态对话框改为非模态对话框,让大家看下效果。

非模态对话框的对话框资源和对话框类

实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,所以上一讲中创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改。

创建及显示非模态对话框的步骤

需要修改的是,对话框类实例的创建和显示,也就是之前在CAdditionDlg::OnBnClickedAddButton()函数体中添加的对话框显示代码。下面是具体步骤:

1.在AdditionDlg.h中包含CTipDlg头文件并定义CTipDlg类型的指针成员变量。详细操作方法是,在AdditionDlg.cpp中删除之前添加的#include "TipDlg.h",而在AdditionDlg.h中添加#include "TipDlg.h",这是因为我们需要在AdditionDlg.h中定义CTipDlg类型的指针变量,所以要先包含它的头文件;然后在AdditionDlg.h中为CAdditionDlg类添加private成员变量CTipDlg  *m_pTipDlg;。

2.在CAdditionDlg类的构造函数中初始化成员变量m_pTipDlg。如果cpp文件中函数太多,我们可以在Class View上半个视图中找到CAdditionDlg类,再在下半个视图中找到其构造函数双击,中间客户区域即可马上切到构造函数的实现处。在构造函数体中添加m_pTipDlg = NULL;,这是个好习惯,鸡啄米在C++编程入门系列的指针的赋值和指针运算中说到过,在任何指针变量使用前都初始化,可以避免因误访问重要内存地址而破坏此地址的数据。

3.将上一讲中添加的模态对话框显示代码注释或删除掉,添加非模态对话框的创建和显示代码。VC++中注释单行代码使用“//”,注释多行代码可以在需注释的代码开始处添加“/*”,结束处添加“*/”。修改后的CAdditionDlg::OnBnClickedAddButton()函数如下:

C++代码
  1. void CAdditionDlg::OnBnClickedAddButton()
  2. {
  3. // TODO: Add your control notification handler code here
  4. /*INT_PTR nRes;             // 用于保存DoModal函数的返回值
  5. CTipDlg tipDlg;           // 构造对话框类CTipDlg的实例
  6. nRes = tipDlg.DoModal();  // 弹出对话框
  7. if (IDCANCEL == nRes)     // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行
  8. return;*/
  9. // 如果指针变量m_pTipDlg的值为NULL,则对话框还未创建,需要动态创建
  10. if (NULL == m_pTipDlg)
  11. {
  12. // 创建非模态对话框实例
  13. m_pTipDlg = new CTipDlg();
  14. m_pTipDlg->Create(IDD_TIP_DIALOG, this);
  15. }
  16. // 显示非模态对话框
  17. m_pTipDlg->ShowWindow(SW_SHOW);
  18. // 将各控件中的数据保存到相应的变量
  19. UpdateData(TRUE);
  20. // 将被加数和加数的加和赋值给m_editSum
  21. m_editSum = m_editSummand + m_editAddend;
  22. // 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值
  23. UpdateData(FALSE);
  24. }

4.因为此非模态对话框实例是动态创建的,所以需要手动删除此动态对象来销毁对话框。我们在CAdditionDlg类的析构函数中添加删除代码,但是MFC并没有自动给出析构函数,这时需要我们手动添加,在对话框对象析构时就会调用我们自定义的析构函数了。在AdditionDlg.h文件中为CAdditionDlg添加析构函数声明:~CAdditionDlg();,然后在AdditionDlg.cpp文件中添加析构函数的实现,函数体如下:

C++代码
  1. CAdditionDlg::~CAdditionDlg()
  2. {
  3. // 如果非模态对话框已经创建则删除它
  4. if (NULL != m_pTipDlg)
  5. {
  6. // 删除非模态对话框对象
  7. delete m_pTipDlg;
  8. }
  9. }

这样,非模态对话框创建和显示的代码就添加修改完了。让我们运行下看看效果吧。

在加法计算器对话框上输入被加数和加数,然后点“计算”按钮,依然像上节一样弹出了提示对话框,但是先不要关闭它,你可以拖动它后面的加法计算器对话框试试,我们发现加法计算器对话框竟然可以拖动了,而且“和”编辑框里已经显示了运算结果,这表明提示对话框显示以后还没有关闭,OnBnClickedAddButton() 就继续向下执行了,不仅如此,加法计算器的每个编辑框还都可以响应输入。

转载地址:http://www.jizhuomi.com/software/162.html

转载于:https://www.cnblogs.com/zfluo/p/5131915.html

鸡啄米vc++2010系列11(非模态对话框的创建)相关推荐

  1. 鸡啄米vc++2010系列12(属性页对话框)

    前面讲了模态对话框和非模态对话框,本节开始鸡啄米讲一种特殊的对话框--属性页对话框.另外,本套教程所讲大部分对VC++各个版本均可适用或者稍作修改即可,但考虑到终究还是基于VS2010版本的,所以将& ...

  2. 鸡啄米vc++2010系列7(对话框:创建对话框类和添加控件变量)

    前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程 ...

  3. 鸡啄米vc++2010系列32(标签控件Tab Control 下)

    上一节中鸡啄米讲了标签控件知识的上半部分,本节继续讲下半部分. 标签控件的创建 MFC为标签控件的操作提供了CTabCtrl类. 与之前的控件类似,创建标签控件可以在对话框模板中直接拖入Tab Con ...

  4. 鸡啄米vc++2010系列40(文档、视图和框架:分割窗口)

    分割窗口概述 分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型的视图,或者是不同类型的视图. MFC分割窗口的方式有两种,动态分割和静态分割. 动态分割窗口通 ...

  5. 鸡啄米vc++2010系列35(工具栏资源及CToolBar类)

    工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程序会执行相应的操作,如果鼠标没有点击,只是停留在某个按钮上一会后,会弹出一个小窗 ...

  6. 鸡啄米vc++2010系列2(项目文件分析)

    用应用程序向导生成框架程序后,我们可以在之前设置的Location下看到以解决方案名命名的文件夹,此文件夹中包含了几个文件和一个以工程名命名的子文件夹,这个子文件夹中又包含了若干个文件和一个res文件 ...

  7. 鸡啄米vc++2010系列27(列表视图控件List Control 上)

    列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁.直观,在实际应用中能为用户带来方便. 列表视图控件是对前面讲到 ...

  8. vc++开发学习二(模态对话框和非模态对话框的创建和销毁)

    ①.模态对话框与非模态对话框的区别: 模态对话框:一旦创建模态对话框,则无法操作父对话框,只能操作当前创建的模态对话框,关闭当前模态对话框后才可以操作父对话框非模态对话框:和模态对话框相反,创建该对话 ...

  9. 关于模态对话框和非模态对话框的创建、显示,以及和父对话框的传值

    当然网上关于这方面的技术博文非常多,此处我只是进行一下小记,再加一点自己的体会,方便以后查询. 一.模态对话框 1.创建及显示 模态对话框是一种阻塞式的对话框,即没有处理完该对话框,不能对其他地方进行 ...

最新文章

  1. 欧拉、欧几里得、笛卡尔都没能解决的数学问题,他探索了新的方案
  2. from表单POST提交nodejs
  3. mybatis返回map键值对_mybatis返回map key怎么指定
  4. 显示数据库的所有表名,字段名,库名
  5. hsqldb和mysql_HSQLDB的研究与性能测试(与Mysql对比)
  6. Python 下的 lambda 算子
  7. JS学习总结(13)——DOM
  8. html list列表
  9. Tools介绍:最快的DicomViewer软件 - RadiAnt Dicom Viewer
  10. java通过poi转换ppt/pptx内容,输出为PNG图片。
  11. 十大虚拟化最佳实践(转自Wes Miller的文章)
  12. 行情 api php,股票实时数据接口说明,股票实时行情api接口
  13. 计算机在欢迎进不到桌面,电脑一直在欢迎界面进不去怎么解决_电脑开机一直卡在欢迎界面怎么办-win7之家...
  14. 4A 统一安全管理平台解决方案。
  15. win7计算机任务栏颜色怎么,如何修改win7电脑下方任务栏的颜色?
  16. 计算机论文致谢词范文500字,论文致谢词范文
  17. 磁力链接搜索网站研究心得!
  18. 设计模式之委派模式(不属于23种经典设计模式之一)
  19. OpenGLES---设置获取Shader程序属性
  20. 2023年留学生入户广州户口条件会有哪些

热门文章

  1. Educational Codeforces Round 75 (Rated for Div. 2)
  2. 模拟栈 java_Java 模拟栈结构
  3. html显示假的图片路径,实现自己网站的图片假水印功能
  4. 电脑cmd命令大全_查询电脑IP地址
  5. 【考试战报】ORACLE OCP 19C考试通过
  6. 创维e900s用的什么芯片_MT41K512M16HA-125_苹果XR用的是什么闪存芯片
  7. python字典get计数_Python内部是如何存储GC引用变量的计数的?
  8. python字符串中某个字符修改_Python中修改字符串的四种方法
  9. 8 使用_【化学技能8】 酸式滴定管的使用
  10. python 之GUI设计:Entry组件