5.2 创建有模式对话框

使用有模式对话框时在对话框弹出后调用函数不会立即返回,而是等到对话框销毁后才会返回(请注意在对话框弹出后其他窗口的消息依然会被传递)。所以在使用对话框时其他窗口都不能接收用户输入。创建有模式对话框的方法是调用CDialog::DoModal()。下面的代码演示了这种用法:

CYourView::OnOpenDlg()
{CYourDlg dlg;int iRet=dlg.DoModal();
}

CDialog::DoModal()的返回值为IDOK,IDCANCEL。表明操作者在对话框上选择“确认”或是“取消”。由于在对话框销毁前DoModal不会返回,所以可以使用局部变量来引用对象。在退出函数体后对象同时也会被销毁。而对于无模式对话框则不能这样使用,下节5.3 创建无模式对话框中会详细讲解。

你需要根据DoModal()的返回值来决定你下一步的动作,而得到返回值也是使用有模式对话框的一个很大原因。

使用有模式对话框需要注意一些问题,比如说不要在一些反复出现的事件处理过程中生成有模式对话框,比如说在定时器中产生有模式对话框,因为在上一个对话框还未退出时,定时器消息又会引起下一个对话框的弹出。

同样的在你的对话框类中为了向调用者返回不同的值可以调用CDialog::OnOK()或是CDialog::OnCancel()以返回IDOK或IDCANCEL,如果你希望返回其他的值,你需要调用 
CDialog::EndDialog( int nResult );其中nResult会作为DoModal()调用的返回值。

下面的代码演示了如何使用自己的函数来退出对话框:下载例子

void CMy52_s1View::OnLButtonDown(UINT nFlags, CPoint point)
{//创建对话框并得到返回值CView::OnLButtonDown(nFlags, point);CTestDlg dlg;int iRet=dlg.DoModal();CString szOut;szOut.Format("return value %d",iRet);AfxMessageBox(szOut);
}
//重载OnOK,OnCancel
void CTestDlg::OnOK()
{//什么也不做
}
void CTestDlg::OnCancel()
{//什么也不做
}
//在对话框中对三个按钮消息进行映射
void CTestDlg::OnExit1()
{CDialog::OnOK();
}
void CTestDlg::OnExit2()
{CDialog::OnCancel();
}
void CTestDlg::OnExit3()
{CDialog::EndDialog(0XFF);
}

由于重载了OnOK和OnCancel所以在对话框中按下Enter键或Escape键时都不会退出,只有按下三个按钮中的其中一个才会返回。

此外在对话框被生成是会自动调用BOOL CDialog::OnInitDialog(),你如果需要在对话框显示前对其中的控件进行初始化,你需要重载这个函数,并在其中填入相关的初始化代码。利用ClassWizard可以方便的产生一些默认代码,首先打开ClassWizard,选择相应的对话框类,在右边的消息列表中选择WM_INITDIALOG并双击,如图,ClassWizard会自动产生相关代码,代码如下:

BOOL CTestDlg::OnInitDialog()
{/*先调用父类的同名函数*/CDialog::OnInitDialog();/*填写你的初始化代码*/    return TRUE; 

[MFC] CDialog::DoModal()函数用法相关推荐

  1. DoModal()函数

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

  2. C++API【CDialog::DoModal()】【AfxEnableControlContainer 函数】

    SYD8821是具有全球领先低功耗(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率)的蓝牙低功耗SOC芯片,在极低电流下实现了优异的射频性能,搭配176kB SRAM ...

  3. VC中常见API函数用法(经验版)

    ***********************************************声明*************************************************** ...

  4. MFC多线程各种线程用法 .

    一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为 IDC_SLEEP_SI ...

  5. MFC总结之CListCtrl用法及技巧(二)

    续第一篇:MFC总结之CListCtrl用法及技巧(一) http://blog.csdn.net/zwgdft/article/details/7560592 本篇重点介绍:禁止拖动表头.让第一列居 ...

  6. strstr函数php,strstr 函数用法

    strstr strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL. C语言函数 函数名: s ...

  7. BitBlt函数用法

    BitBlt函数用法 2010-03-05 10:25:51|  分类: VC学习|举报|字号订阅 下载LOFTER我的照片书  | (一) BOOL BitBlt( int x, int y, in ...

  8. 【转】sprintf函数用法

    sprintf函数用法 原帖地址 : http://www.programfan.com/blog/article.asp?id=12763 在将各种类型的数据构造成字符串时,sprintf 的强大功 ...

  9. 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法

    目录 高阶函数用法 作为值的函数 匿名函数 柯里化(多参数列表) 闭包 高阶函数用法 Scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是"头等公民",它和Int. ...

最新文章

  1. mysql limit优化
  2. php七天登录,十天学会php之第七天
  3. python之模块导入和包
  4. MFC入门示例之静态文本框、编辑框
  5. 谁说程序员找不到女朋友,你们是不知道当程序员撩妹,一撩一个准
  6. 计算几何的模板(大神整理)
  7. 解决 macbook m1 苹果笔记本电脑 关闭盖子 休眠
  8. 使用存储过程返回结果集
  9. 网口up不起来问题排查
  10. Linux——一文彻底了解进程id和线程id的关系(什么是pid、tgid、lwp、pthread_t)
  11. HTML5学习笔记--第六章 文本元素
  12. EMC(1)——外设接口ESD防护电路设计
  13. [转]一往无前 | 小米十周年,雷军公开演讲全文
  14. 《铁路竹枝词四首》_文若
  15. 设计企业PM能力与EPC不相适应,有何对策?
  16. 用TensorFlow和TFSlim实现图像分类与分割
  17. c++解析tcp头部遇到的大小端转换问题
  18. 东北大学 Java练习 作业1 Implementing the Gourmet Coffee System
  19. 几行代码,把zip文件直接破解
  20. 最大公约数和最小倍数

热门文章

  1. Mac使用sdkmanager从官网下载新版android SDK
  2. 解决JupyterLab/JupyterNotebook安装pycherts后依旧报错报错 ModuleNotFoundError: No module named ‘pyecharts‘
  3. snownlp文本分词、情感分析、文本相似度与摘要生成
  4. Mac 终端连接linux程服务器并相互传输文件
  5. 支持多协议多服务的服务器设计和实现的步骤,基于多协议的人工影响天气接入服务器设计与实现...
  6. 利用开放定址法实现散列表的创建、插入、删除、查找操作_散列表和IO
  7. 清除mysql数据碎片_MySQL 清除表空间碎片方法总结
  8. 要素集获取要素_Excel点文件转面要素
  9. 和push的区别_RocketMQ的消息订阅push和pull的区别
  10. 06_Jedis完成MySQL的条件查询案例