当前位置:首页 > 编程开发

模态对话框和非模态对话框的区别

webgou17年前 (2009-10-14)编程开发154

模态对话框就是指那种“显示出来就不可以点选位于其下面的对话框”的对话框;反之的就是非模态对话框。
两者的区别:

一. 非模态对话框的模板必须具有Visible风格(Visible=True),否则对话框将不可见,而模态对话框则无需设置该项风格。在实际编程中更加保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。

二. 非模态对话框对象是用new操作符来动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建的。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。

三. 通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是两者之间区别的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆栈中构建对话框对象,而不能以局部变量的形式来构建之。

四. 必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。

五. 因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下
void CModelessDialog::PostNcDestroy
{delete this;    //删除对象}
这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者就不必显式地调用delete来删除对话框对象了。

六. 必须有一个标志表明非模态对话框是否打开的。这样做的原因是用户有可能在打开一个模态对话框的情况下,又一次选择打开命令。程序根据标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指针赋NULL值,以表明对话框对象已不存在了。

例如:

创建模态对话框

CTestDlg dlg;

dlg.DoModal();

创建非模态对话框

CTestDlg * dlg = new CTestDlg;

dlg->Create(IDD_TEST_DLG);

dlg->ShowWindow(SW_SHOW);

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sky04/archive/2009/01/06/3719147.aspx

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=68

标签: vc
分享给朋友:

“模态对话框和非模态对话框的区别” 的相关文章

FM 中的 RDS 功能

 从网上搜来的字面解释是:RDS是英国BBC广播公司开发的一种特殊的无线电广播,称”无线数据广播系统“(Radio Data System),它是在调频广播发射信号中利用副载波把电台名称、节目类型、节目内容及其它信息以数字形式发送出去。通过具有RDS功能的调谐器就…

mysql 远程连接方法

mysql -h 192.168.1.10(主机地址) -usun(用户名,-u可以连写,下同) -psunsun(密码) …

apache+tomcat+mysql 负载平衡和集群

apache+tomcat+mysql 负载平衡和集群前言:公司开发了一个网站,估计最高在线人数是3万,并发人数最多100人。开发的网站是否能否承受这个压力,如何确保网站的负荷没有问题,经过研究决定如下:(1) 采用负载平衡和集群技术,初步机构采用Apache+Tomcat的机群技术。(2) 采用压…

个人学习思考(由github建网)

从事软件开发,实践非常重要。 最近在学习github建立个人page,引发了对学习新的东西的一种思考。个人对于接触新的东西往往会不知所措,而时心里会大乱阵脚。先来分析下学习github整个过程: 1。明确学习东西,达到的目的。github建个人网页,可以跳转域名。 2。确定学习细节,一个个攻破。…

工作中的小失误原因分析

在工作中,测试发现的一个问题,追其原因是----把代码同步错了.这几天心中一直在想,如何尽量避免这样的小错误.那有又哪些原因呢? 罗列下原因: 1.在写程序时,被打断次数太多,临时追加任务就很容易出错. 2.去调车,在太阳下晒一两天,我想基本上是没心事再去总结问题或是写代码. 3.变化时刻存在:领…

MacBook 常用快捷键

Mac OS X系统图形表示方法⇧ = shift⌃ = control⌥ = option / alt Home=fn + ◄ End=fn + ► Page Up=fn + ▲Page Down=fn + ▼ 删除后一个字符(普通键盘的Delete)=fn…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。