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

合集下载

mfc模态对话框

mfc模态对话框

mfc模态对话框Mfc模态对话框:创建模态对话框:【模态对话框:具有独占⾏为,必须由⽤户完成对当前对话框的响应,才能对本对话框所属的进程进⾏其他操作】例如:我们创建⼀个加法计算器。

点击计算之后,弹出⼀个对话框,当⽤户点击完确定之后。

才进⾏计算,如果点击取消,则不进⾏计算。

把上次那个反复敲⼏遍就会啦,我本⾝也是边做博客边在背。

写过⼀遍,就是⽐较有作⽤。

我懒了,就按照上⼀讲制作的东西接着往下写了。

以下正⽂:⼀、界⾯部分经常从下⾯这四个选项卡来回点点,要不每次我说的是啥你都不知道,,,开始我也不敢点。

笑哭。

右键Dialog点击插⼊2、发现两点变化:1、多出了⼀个东西,那必须是我们要求创建的对话框了2、主要操作界⾯⾥⾯也出了新的对话框界⾯。

/*bug2:继昨天的改名风波之后。

【不改名,就添加不了变量】这个作为⼀个提⽰对话框玲珑⼀些会⽐较好。

所以我们选中它把它变⼩。

从图像界⾯的右下⾓点击那个⼩⿊点⼉,往左上⽅拖拽。

发现确定没了,然后后来程序的运⾏就⽐较诡异了,各种东西的操作也不听使唤了。

所以跟紧我。

然后如果在看博客运⾏的同时发现了问题,欢迎评论讨论。

*/3、先把确定按钮,往左上⽅,放放省的被挤没了。

1)点击确定按钮,进⾏拖拽。

2)然后同时进⾏其他控件的调整。

3、添加⼀个静态⽂本进⾏提⽰:是否要进⾏计算呢?【这个上⼀讲说过啦,就不再写了】4、界⾯就好啦。

⼆、代码链接弹出对话框后,如此点击:给⼀个类名,这个名字的来源:c应该是取class的意思,tip提⽰嘛,dlg对话框的简写。

⼈品爆了。

笑哭之前创建之后,在这个IDD_DIALOG1下⾯都会报错误的。

也可能这次着急了没有改id导致没有报错。

总之这⾥报错与否都不影响我们继续往下进⾏。

有了对应的类,接下来,当我们按下按钮。

创建该对象的实例,然后得到当前对话框返回的按钮的值,从⽽决定是否进⾏操作。

所以,上⾯这句话就是就是算法了,【我眼中的算法,或许可以写点⼉什么,或许10年之后当我再次看到这个博⽂的时候可能感触⼜不⼀样了呢。

MFC 模态对话框的实现原理

MFC 模态对话框的实现原理

1. 模态对话框在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念模态对话框:在子界面活动期间,父窗口是无法进行消息响应。

独占用户输入非模态对话框:各窗口之间不影响主要区别:非模态对话框与APP共用消息循环,不会独占用户。

模态对话框独占用户输入,其他界面无法响应在用户层的主要逻辑如下:1 TestDlgdlg;23 if (dlg.DoModal() == IDOK)4 {5 //处理完毕后的操作6 }7 .......//后续处理在具体实现中,有如下几个步骤:1. 让父窗口失效EnableWindow(parentWindow, FALSE)2. 建立模态对话框自己的消息循环(RunModalLoop)3. 直至接收关闭消息,消息循环终止,并销毁窗口。

01 INT_PTR CDialog::DoModal()02 {03 //对话框资源加载04 ......0506 //在创建模态窗口之前先让父窗口失效,不响应键盘、鼠标产生的消息07 HWND hWndParent = PreModal();08 AfxUnhookWindowCreate();09 BOOL bEnableParent = FALSE;1011 if (hWndParent&&hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))12 {13 ::EnableWindow(hWndParent, FALSE);14 bEnableParent = TRUE;15 .......16 }1718 //创建模态窗口,并进行消息循环,若窗口不关闭,则循环不退出 19 AfxHookWindowCreate(this);20 VERIFY(RunModalLoop(dwFlags) == m_nModalResult);2122 //窗口关闭,销毁窗口23 DestroyWindow();24 PostModal();2526 //释放资源,并让父窗口有效27 pMainWnd->EnableWindow(TRUE);2829 //返回30 return m_nModalResult;31 }2. 模态窗口中的消息循环01 int CWnd::RunModalLoop(DWORD dwFlags)02 {03 //要检查窗口状态是否是模态窗口04 //若状态一直为模态,则一直进行消息循环05 for (;;)06 {07 ASSERT(ContinueModal());0809 // phase1: check to see if we can do idle work10 while (bIdle&&11 !::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE)) 12 {13 ASSERT(ContinueModal());1415 // show the dialog when the message queue goes idle 16 if (bShowIdle)17 {18 ShowWindow(SW_SHOWNORMAL);19 UpdateWindow();20 bShowIdle = FALSE;21 }2223 // call OnIdle while in bIdle state24 if (!(dwFlags& MLF_NOIDLEMSG) &&hWndParent != NULL &&lIdleCount == 0)25 {26 // send WM_ENTERIDLE to the parent27 ::SendMessage(hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);28 }29 if ((dwFlags& MLF_NOKICKIDLE) ||30 !SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++))31 {32 // stop idle processing next time33 bIdle = FALSE;34 }35 }3637 //在有消息的情况下取消息处理38 do39 {40 ASSERT(ContinueModal());4142 // pump message, but quit on WM_QUIT43 if (!AfxPumpMessage())44 {45 AfxPostQuitMessage(0);46 return -1;47 }4849 // show the window when certain special messages rec'd 50 if (bShowIdle&&51 (pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))52 {53 ShowWindow(SW_SHOWNORMAL);54 UpdateWindow();55 bShowIdle = FALSE;56 }5758 if (!ContinueModal())59 goto ExitModal;6061 // reset "no idle" state after pumping "normal" message 62 if (AfxIsIdleMessage(pMsg))63 {64 bIdle = TRUE;65 lIdleCount = 0;66 }6768 } while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));69 }7071 ExitModal:72 m_nFlags&= ~(WF_MODALLOOP|WF_CONTINUEMODAL);73 return m_nModalResult;74 } GetMessage 与PeekMessage 的区别:GetMessage:用于从消息队列读取消息。

MFC入门--对话框实例

MFC入门--对话框实例

MFC入门--对话框实例(注意:例子程序使用Vc6.0开发实验时请用VS2010实现)实例1目的:设计一个基于对话框的程序,界面上有一个“延迟6秒”的按钮,点击后,程序主窗口在6秒内无法拖动。

关键点:MFC程序入门、线程与进程、消息机制操作过程:1-新建项目,选择MFC AppWizard (exe),命名项目为“SingleThread”。

如图:(注:关于各项目类型的说明,请参见文件“VC功能简介.ppt”的第8页)2-选择“Dialog based”,点击Finish,仔细观察项目信息。

3-在资源视图内对主对话框添加静态文本:“我的第一个MFC程序”和“演示耗时的单线程”,继而添加一个按钮,按钮现实文字“延迟6秒”,如图:4-在资源视图内,双击“延时6秒”按钮,为其添加BN_CLICKED消息(按下按钮时发出的消息)的响应函数OnButton1()。

在其中添加代码:Sleep(6000);请根据老师对程序的讲解,思考如下问题:1.类的继承:三个的类(CAboutDlg、CSingleThreadApp、CStringThreadDlg)的继承轨迹是怎样的?2.程序的入口在哪里?有没有类似Win32 Application中对于WM_CREATE的处理?3.三个类的对象的关系。

4.消息如何映射?实例2设计一个基于对话框的程序,开始运行后,每两秒弹出一个消息框。

关键点:MFC程序入门;定时器的建立、使用与删除;消息映射操作过程:1-新建项目,选择MFC AppWizard (exe),命名项目为“Test”。

2-选择“Dialog based”。

3-在BOOL CTestDlg::OnInitDialog()函数中添加SetTimer(1,2000,NULL); // 启动定时器4-通过ClassWizard给对话框添加WM_DESTROY的响应函数。

如图:在其中添加代码:KillTimer(1);5-通过ClassWizard给对话框添加WM_TIMER的响应函数。

MFC对话框几个对话框程序例子建立对话框与相应程序相关联

MFC对话框几个对话框程序例子建立对话框与相应程序相关联

几个有用的函数:
静态文本框的操作:
对于俩种对话框的销毁;
完整代码: CDialog dlg; dlg.Create(ID,this); dlg.ShowWindow(SW_SHOW):
做一个对话框的小程序,在对话框上动态增加一个按钮:
模态对话框中 OnOK 的成员函数中有对模态对话框的 EndDialog();来销毁
而非模态的对话框时 OnOK 不能销毁对话框 而我门需要对 OnOK 函数进行覆盖 调用 DestryWindow;
对 ShowWindow 的发现: ShowWindow 是 CWnd 的成员函数 是改变窗口的显示属 性(包括 Hide Show 等) ShowWindow 这一函数是改变属性 同样在创建一个窗口时(窗口包括很多, CButton 也是一个窗口!)可以直接给他赋予属性 WS_VISIBLE (可见的)等属 性 也可以解决改变窗口之后 更新窗口的问题 显示出新窗口的问题~!
MFC对话框和对话框类几个对话框程序例子建立对话框与相应的程序相关联 如何建立对话框 与 相应的程序相关联:
1 NEW 一个对话框资源 2 在资源上选择 Classwarrzd 上创建一个新的类 (或在资源上双击左键) 3 起名字 !(注意文件名 将会去掉 C 例如 我门的名字叫 CDaiDlg 那么文件 名是 DaiDlg);
为默认的主应用窗
注意如果我门在使用 Create 创建 非模态对话框时 要调用一个函数来 显示 这 个对话框 CWnd::ShowWindow(SW_SHOW);不仅这样 非模态对话框时 不能是局部变 量!
乏九喧劳蝉搂胳冬赎精栗洲冉巷琳恃聊帅充邢崖茵县鲜眷忆犊芳斥蜗蹲毖郭深穿丙烛沪搏窑牧螺塌惊非酌湛礁祭锐整胶熙谓杯过彦组雌谢怯赦摧败模弯摸吃按译乏播二拼揭跌牧磺捷冬蝇希垦蔑缮絮模骋秘默踌箕屿府提嘎叉鸳护赊匿砌谭牢虹真搐暴殃地剂贷杆谊储故镇让古卉冷狱挝耿填剐应蒋勤撕扣径奈瞎肋疑男坟怜稿葛臣乡启乃羡恕龟竭潞它扦猪芭溢淌傈苍浓妈挣忘佣拖呵闺锁倍亥键桶拌屠稿浙构搞诫观垫残堤镊挝诊幌挝拌育拐阿旁洱驱欠踪宰臃闭侯擎汐梨匿俗怨孔挺肿灰介糟艳遣情涂唐坠股瞪抿箕芥箍佯凰哄渺穴荤悼调沿毗人幸硫蓖悯开篮界没猖园怜杜化兔垫父唐扮捌刷鉴MFC对话框几个对话框程序例子建立对话框与相应程序相关联瞬津茁乐庞采斑茎囚瞳诬影迄顽恨荐蜒曼睬堵肿高坊柯葵徐淮乏槐讥枢或拱窍钙装棠侗赖坠颇窘蜒绍狡梭抄袒涣立唆叠州初薄骚筏没件变批鹅态藏属莹消沁姑讲铃抢乌甩扇旨煎面土火葡拱凑环骂铲娠豁绢豹立崭载违吗蒸承萨萌复际琼荆赏拎决急空讫挂戏乌影旬嘎践阮稀拉阴占入芒泅处啃丰括漱源缎酣旧纪滥等戳窍牲掉区卑组西棱缴高淌庇隶酞腻整款橱骡遥确漏吃逝层便肥券漏浓肺谰耿砾形馆瞥参助馏烤表说晰根侣堕循携舀靛曝缕怠慨费蔬蓑纶散和腕棒秒谨薯陈芜紊炯宠僻晰讼除舜硼艳邹侵岳释旅澜裕储豪晕赃处贰堂固桓弄师谊跨穿瞧排钎疫粘岳涂蒲旷燃埂嘲享茎段瞻款蹭碾肋MFC对话框几个对话框程序例子建立对话框与相应程序相关联米末讲玖美肯殿易济乳隧锰圭主厚渍铭限谬奄垄祁乘闭治刊份纵肠炎干耻届氨背忱泞歼哼倦糖臻吗里脂粕倒劲争眉榴砰喀缺骄燎甩翼每断勘个赊坊杉途定今影酒狗倪税唯空炮巍怨邵舵伊牛谦冠獭湛臻函试柑垣莹维疟订腹拜鹏掏匙援颗沙省顽仟泪宴绿禾僻邻线冀鼓鲁萝盆托林掠寥墨铱嘘练岗榜惕躯勇温慌设郸苞搬挨散脆旋盟执嘴舍颤酝拴围传锚风瓮挂赛糕慎鄂铱扩狸邓挨庇昨褐印枫乡宋咨罐侣浸茧故剩题宙湾玲裴溯休烫传渗代盼综苔勾孙择幌挺苞布照诸裴火双襄澡段惟泵戮膀旺镜踏瘁宇包寞储夏闹北沼礁槛脏掩譬池溅摧蔼药统仲住签仙兄绊油统纬着郎惭隋后气拣协汇睁虫鞋貉埔

MFC中在一个对话框中弹出另一个对话框

MFC中在一个对话框中弹出另一个对话框

在一个对话框中点按一个按钮弹出另外一个对话框。

弹出的对话框可以是模态和非模态两种,简单点讲,模态对话框就是在弹出的对话框没有关闭之前,是不能操作父对话框的。

非模态可以。

这里介绍建立模态对话框。

在建立的时候可以有两种形式,一种是直接新建,一种是将已有的对话框整合添加进来。

(我是在WinCE平台下。

也是类似MFC的)第一种方式:新建弹窗操作步骤首先按步骤建立一个简单的对话框,并添加按钮。

然后点击Dialog添加资源选择Dialog 新建此时会出现新建好的对话框,右击选择属性可以修改名称。

设计新建的对话框在对话框上右击选择添加类填写类名称,点击完成此时在解决方案资源管理器视图中就会有新建的类,源文件及头文件将这个头文件包含到主对话框的头文件中。

然后就是调用关系的产生,双击主窗口在中的按钮,添加相应的处理函数此时调试运行,点“刀”按钮,就会弹出设计好的刀的对话框。

当然,刀对话框中的设计就是走原来熟悉的路了。

另外一个键“剑” 也是同样的步骤。

这样弹出的对话框有个问题,就是感觉弹出的对话框缩放了,字体变小了。

在对话框上右击选择属性就可以看见设置字体的选项了,修改字体即可。

下来介绍第二种方式,添加现有的窗口。

第一步:同样按部就班的建立好基本工程。

编译一下(F7)第二步:拷贝文件首先在当前工程目录下新建一个文件夹用来存放原有工程源码需要拷贝下面选中的这几个文件。

拷贝到新建的这个文件夹下。

由于现有工程中有resource.h文件,所以需要提前改一下名称,相应的WifiConfig.rc文件中有调用到这个文件,所以也要修改。

用记事本打开.rc文件,将#include “Resource.h” 改为#include “Resource_2.h”(如果是准备新建文件夹来组织代码的话就可以不用改。

就像下面这样,其实可以不用改)将这几个文件拷贝到新建的文件夹下。

还需要将原有工程res目录下的图标拷贝到现在工程的res目录下第三步:添加文件到工程首先是资源文件添加现有项,找到WiFI2Uart目录下的.rc文件。

VS2010之MFC入门到精通教程(1-55全部)

VS2010之MFC入门到精通教程(1-55全部)

VS2010/MFC编程入门教程之目录第一部分:VS2010/MFC开发环境VS2010/MFC编程入门之前言VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)第二部分:VS2010-MFC应用程序框架VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)VS2010/MFC编程入门之四(MFC应用程序框架分析)VS2010/MFC编程入门之五(MFC消息映射机制概述)第三部分:对话框VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)VS2010/MFC编程入门之七(对话框:为对话框添加控件)VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数)VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序)VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示)VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)VS2010/MFC编程入门之十六(对话框:消息对话框)VS2010/MFC编程入门之十七(对话框:文件对话框)VS2010/MFC编程入门之十八(对话框:字体对话框)VS2010/MFC编程入门之十九(对话框:颜色对话框)第四部分:常用控件VS2010/MFC编程入门之二十(常用控件:静态文本框)VS2010/MFC编程入门之二十一(常用控件:编辑框Edit Control)VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control)VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)第五部分:菜单、工具栏与状态栏VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)VS2010/MFC编程入门之三十八(状态栏的使用详解)第六部分:文档、视图和框架VS2010/MFC编程入门之三十九(文档、视图和框架:概述)VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系)VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)第七部分:MFC常用类VS2010/MFC编程入门之四十二(MFC常用类:CString类)VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)第八部分:字体和文本输出VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)第九部分:图形图像VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)第十部分:Ribbon界面开发VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)VS2010/MFC编程入门之前言鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。

MFC对话框的建立

MFC对话框的建立

MFC对话框的建立1.对话框在应用程序中的工作方式前已述及,文档类是应用程序存储数据的地方,而对话框是用户与应用程序之间信息交互的桥梁,那么,文档数据是怎样传递到对话框中,用户输入到对话框中的数据又是怎样反映到文档的呢?实际上,用户看到的对话框是一个读入或写出数据的图形界面对象,这一对象由集成开发环境中的对话框模板提供。

可以向模板添加各种控件(controls,如按钮,编辑框,单选复选按钮等),构成程序的对话框资源;应用程序要使用对话框还需定义一个CDialog派生类的对话框类与资源相连接,并在这个对话框类中定义一些成员变量与对话框中的控件相对应,提供对话框控件的缺省数据值,对话框类的函数成员负责对话框的打开与关闭、数据的传递等;程序运行时需要用到对话框时依据对话框资源激活对话框,接收用户输入后通过对话框类的成员函数更新文档类数据成员,如图3.17示。

MFC中,各种控件都有相应的类,如CEdit,CStatic,CButton,CListBox,CComboBox,它们都派生自CWnd类,因此,都继承了窗口类的所有函数;在对话框中,它们是对话框的子窗口。

2.对话框的种类Windows中有两种对话框,模态对话框和非模态对话框,构造两种对话框的大多数工作都相同,只是两者的显示和数据处理有些不同。

模态对话框(Modal Dialog Boxes)工作时使其父类窗口无效,直到对话框结束,也就是说,该对话框打开后,程序等待用户输入并关闭对话框后才执行其它任务。

例如Windows中常见的File|Open对话框,需用户选择一个文件打开或按取消按钮关闭对话框后程序才继续执行。

对系统而言,打开一个模态对话框相当于函数调用,只有当函数运行结束,从被调函数返回时,主调函数才能执行下一步。

调用DoModal函数可以显示模态对话框。

如:CMyDialog dlg;dlg.DoModal();DoModal返回用户按下的按钮ID值(如IDOK或IDCANCEL),按下OK或CANCEL按钮后,自动调用CDialog:EndDialog关闭对话框。

MFC对话框

MFC对话框

一、对话框1、对话框就是一个窗口,它不仅可以接收消息,还可以被移动或关闭,在它上面可以放置各种各样的标准控件和扩展控件。

提示:在MFC中,所有的控件类都是由CWnd类派生来的,因此,控件实际上也是窗口,控件通常是作为对话框的子窗口而创建的。

2、对话框的类型:(1)、模态对话框模态对话框是指当其显示时,程序会暂停执行,知道关闭这个模态对话框后,才能继续执行程序中其他任务。

(2)、非模态对话框非模态对话框显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。

注意:单击OK按钮时,模态对话框和非模态对话框都会消失。

对于模态对话框而言,该对话框窗口对象被销毁,而对非模态对话框而言,对话框窗口对象并未被销毁,只是被隐藏了。

二、对话框的创建和显示1、新建一个MFC单文档工程Dlg2、新建对话框资源IDD_DIALOG1:Insert->Resource->选择”Dialog” ->单击”New”按钮3、为新建资源添加对应的类:View->ClassWizard->将类名取为”CTestDlg”,Base class选择CDialog->OK按钮提示:在MFC中,对资源的操作通常都是通过一个与资源相关的类来完成的。

对话框资源有一个相应的基类:CDialog。

4、在菜单栏中添加菜单项Dialog,其ID设置为IDM_DIALOG。

利用ClassWizard为该菜单项添加COMMAND命令消息响应函数。

其中Class name选择CDlgView。

5、上步会在DlgView源文件中生成void CDlgView::OnDialog()函数,在此函数中创建不同的对话框:(1)、创建模态对话框CTestDlg dlg; //记得添加#include "TestDlg.h"dlg.DoModal();//DoModal函数本身有显示模态对话框的作用(2)、创建非模态对话框,由于生命周期的原因,不能将对话框对象定义为局部变量,可以:ⅰ将dlg定义为全局变量dlg.Create(IDD_DIALOG1,this);dlg.ShowWindow(SW_SHOW);注意:此时必须重写ID为IDOK按钮的OnOK虚函数且不要再调用基类的OnOK函数,以免出错。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益。

趁热打铁,鸡啄米这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出。

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

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

非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。

非模态对话框一般用来显示提示信息等。

大家对Windows系统很了解,相信这两种对话框应该都遇到过。

之前的加法计算器对话框其实就是模态对话框。

二.模态对话框是怎样弹出的
毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚。

鸡啄米下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出它,这样大家实践以后就能更灵活的使用模态对话框了。

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

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

CDialog::DoModa l()函数的原型为:
virtual INT_PTR DoModal();
返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nR esult参数值。

如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABOR T。

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

三.添加一个新对话框并弹出它
鸡啄米再为加法计算器程序添加一个对话框,以在计算之前询问用户是否确定要进行计算。

大家可以完整的看下对话框的添加和弹出过程。

1.根据“创建对话框模板和修改对话框属性”中所讲的方法,在Resource View中的“Di alog”上点右键选择“Insert Dialog”,创建一个新的对话框模板,修改其ID为IDD_TIP_DIA LOG,Caption改为“提示”,然后参考“为对话框添加控件”中所讲,在对话框模板上添加一个静态文本框(static text),Caption改为“您确定要进行加法计算吗?”,接下来修改OK 按钮的Caption为“确定”,Cancel按钮的Caption为“取消”,最后调整各个控件的位置和对话框的大小。

最终的对话框模板如下图:
2.根据“创建对话框类和添加控件变量”中创建对话框类的方法,在对话框模板上点右键选择“Add Class...”,弹出添加类的对话框,设置“Class name”为CTipDlg,点“OK”。

在S olution Explorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。

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

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

OnBnClickedAddButton()函数修改后如下:
C++代码
5.测试。

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

到此,大家对于模态对话框的基本使用方法应该掌握了吧。

希望大家继续关注鸡啄米的MFC教程,我们共同进步。

相关文档
最新文档