MFC中模态对话框与非模态对话框的区别

来源:互联网 发布:淘宝店铺如何升级天猫 编辑:程序博客网 时间:2024/05/17 06:17

MFC程序中有两种类型的对话框:模态(Modal)对话框和非模态(Modeless)对话框。

模态对话框是指,当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中的其他任务。例如:一个程序打开了一个模态对话框后,不能进行对该对话框以外的任何操作,只能听到嘟嘟声。

非模态对话框是指,在显示时允许执行程序中其他任务,而不必关闭这个对话框,典型的例子就是记事本程序中的“查找”对话框,该对话框不会垄断用户的输入。甚至在一个程序中可以多次点击一个按键,打开多个相同的对话框。

在显示的方式上,模态对话框的创建,首先是实例化一个对话框对象,然后调用CDialog类的成员函数:DoModal,返回值作为CDialog类的另一个成员函数:EndDialog的参数,用于关闭模态对话框。

而非模态对话框,则需要利用CDialog类的Create成员函数,当利用Create函数创建非模态对话框时,还需要调用ShowWindow函数将对话框显示出来,DoModal函数之所以不需要,是因为DoModal函数就有显示对话框的作用。同时还要注意一点的是,创建非模态对话框,不能把对话框对象定义为局部对象,所以可以将其定义为指针以解决。而释放这个指针,可以通过重载CDialog的PostNcDestroy虚函数。最后,注意,当单击非模态对话框上的【ok】或者【cancel】按钮时,对话框窗口并未被销毁,只是隐藏起来了,所以需要调用DestroyWindow函数,以完成销毁工作。

最后,如果想像模态对话框一样,在一个程序中限制只能打开一次非模态对话框,可以增加一个标识说明是否已经打开了一个非模态对话框,这样程序将根据标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。通常可以用指向对话框对象的指针作为这种标识,当对话框关闭时,给指针赋NULL值,以表明对话框对象已经不存在了。

0 0