对话框的使用

        MFC中的对话框包括模态对话框和非模态对话框,我们平时用的最多的就是模态对话框。模态与非模态对话框之间的最明显的区别(对用户来说)就是,不关闭模态对话框不能对所属程序的其他窗口进行操作,而非模态对话框显示时还可以操作其他窗口。

         和对话框相关的两个东西就是“对话框模板”和“对话框类”,什么是对话框模板呢?其实当你在资源编辑窗口中“搭建对话框”时,你“修饰”的可视对话框就是对话框模板。对话框模板我的理解就是代表了一个资源,而对话框类是一个c++类,在对话框类中指定了与此类相关的对话框模板(资源)。不管是模态对话框还是非模态对话框都必须要有模板和类,在这一点上是一样的。

       表现上区别的原因

        之所以两种对话框的表现有差别,主要在于一个函数CDialog::DoModal。大家都十分了解这个函数,比如在创建一个基于对话框的MFC程序时,在CxxApp的Instance函数中必然有DoModal函数的使用。DoModal的作用是什么?MSDN上讲的并不是十分明白。可以在DoModal函数上加上断点,你会发现DoModal会调用OnInitDialog函数,其实还会调用其他函数,只不过看不见而已。并且发现当执行DoModal函数之后,DoModal后面的代码不会再执行。只有当在关闭了对话框之后(点击了OK或Cancel或点击了系统菜单上的关闭选项),DoModal才会返回并且才会执行后面的代码。也正是DoModal使得模态对话框具有不同于非模态对话框的特性。

        而非模态对话框会使用DoModal函数。非模态对话框的创建过程是这样的:首先上面说过非模态对话框也需要对话框模板,这一点可以在资源编辑器中编辑。然后就是创建一个对话框类,但是只是这样还不足以创建非态对话框,还需要调用CDialog::Create方法,在Create函数中需要指定对话框资源IDD_XXX以及对话框的父窗口指针(默认是NULL)。Create的作用是“Call Create to create a modeless dialog box using a dialog-box template from a resource”(来自MSDN)。然后调用ShowWindow(SW_SHOW),如果对话框的Visual属性是True,就不需要调用。

        但是创建非模态对话框时,有一点需要注意,那就是这个非模态对话框对象应该是个非局部对象,否则你会发现对话框会一闪就消失了,原因必然是对话框对象是局部的,在生命期到后就销毁了。

        创建非模态对话框时,是否指定其父窗口还是有些区别的。当你指定了非模态对话框的父窗口时,一旦父窗口最小化则作为子窗口的非模态对话框也会最小化;但是如果没有指定父窗口时,则不会出现这种情况。这一点值得注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值