[MFC] CDialog::DoModal()函数用法
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()函数用法相关推荐
- DoModal()函数
毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚.鸡啄米下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出它,这样大家实践以后就能更灵活的使用模态对话框了 ...
- C++API【CDialog::DoModal()】【AfxEnableControlContainer 函数】
SYD8821是具有全球领先低功耗(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率)的蓝牙低功耗SOC芯片,在极低电流下实现了优异的射频性能,搭配176kB SRAM ...
- VC中常见API函数用法(经验版)
***********************************************声明*************************************************** ...
- MFC多线程各种线程用法 .
一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为 IDC_SLEEP_SI ...
- MFC总结之CListCtrl用法及技巧(二)
续第一篇:MFC总结之CListCtrl用法及技巧(一) http://blog.csdn.net/zwgdft/article/details/7560592 本篇重点介绍:禁止拖动表头.让第一列居 ...
- strstr函数php,strstr 函数用法
strstr strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL. C语言函数 函数名: s ...
- BitBlt函数用法
BitBlt函数用法 2010-03-05 10:25:51| 分类: VC学习|举报|字号订阅 下载LOFTER我的照片书 | (一) BOOL BitBlt( int x, int y, in ...
- 【转】sprintf函数用法
sprintf函数用法 原帖地址 : http://www.programfan.com/blog/article.asp?id=12763 在将各种类型的数据构造成字符串时,sprintf 的强大功 ...
- 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法
目录 高阶函数用法 作为值的函数 匿名函数 柯里化(多参数列表) 闭包 高阶函数用法 Scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是"头等公民",它和Int. ...
最新文章
- mysql limit优化
- php七天登录,十天学会php之第七天
- python之模块导入和包
- MFC入门示例之静态文本框、编辑框
- 谁说程序员找不到女朋友,你们是不知道当程序员撩妹,一撩一个准
- 计算几何的模板(大神整理)
- 解决 macbook m1 苹果笔记本电脑 关闭盖子 休眠
- 使用存储过程返回结果集
- 网口up不起来问题排查
- Linux——一文彻底了解进程id和线程id的关系(什么是pid、tgid、lwp、pthread_t)
- HTML5学习笔记--第六章 文本元素
- EMC(1)——外设接口ESD防护电路设计
- [转]一往无前 | 小米十周年,雷军公开演讲全文
- 《铁路竹枝词四首》_文若
- 设计企业PM能力与EPC不相适应,有何对策?
- 用TensorFlow和TFSlim实现图像分类与分割
- c++解析tcp头部遇到的大小端转换问题
- 东北大学 Java练习 作业1 Implementing the Gourmet Coffee System
- 几行代码,把zip文件直接破解
- 最大公约数和最小倍数
热门文章
- Mac使用sdkmanager从官网下载新版android SDK
- 解决JupyterLab/JupyterNotebook安装pycherts后依旧报错报错 ModuleNotFoundError: No module named ‘pyecharts‘
- snownlp文本分词、情感分析、文本相似度与摘要生成
- Mac 终端连接linux程服务器并相互传输文件
- 支持多协议多服务的服务器设计和实现的步骤,基于多协议的人工影响天气接入服务器设计与实现...
- 利用开放定址法实现散列表的创建、插入、删除、查找操作_散列表和IO
- 清除mysql数据碎片_MySQL 清除表空间碎片方法总结
- 要素集获取要素_Excel点文件转面要素
- 和push的区别_RocketMQ的消息订阅push和pull的区别
- 06_Jedis完成MySQL的条件查询案例