模态与非模态对话框
功能上区别:
模态对话框运行时,关闭本对话框之前,用户无法对本程序的其他部分进行操作。
而非模态对话框打开同时还可以切换到其他窗口进行操作。
编程实现区别:
模态对话框使用CDialog::DoModal函数来创建,DoModal会启动一个模态对话框自己的消息循环,这也是模态对话框要关闭后才能使用程序其他窗口的原因。DoModal函数在对话框关闭后才返回。
非模态对话框使用CDialog::Creat函数实现,由于Creat函数不好启动新的消息循环,对话框与应用程序共用一个消息循环,因此就不好独占用户输入。
编程实例
(1)新建一个基于对话框的MFC应用程序ModalModelessTest,删除对话框中原有控件。
(2)添加一个按钮,标题是“显示模态对话框”。
(3)插入一个新Dialog,把ID改为“IDD_MODEL”,Caption属性改为“模态对话框”,把新建的对话框上的控件都删除,然后为其添加一个类“CDlgModel”,基类选择“CDialog”。
(4)打开“IDD_MODALMODELESSTEST_DIALOG”对话框,对“显示模态对话框”按钮双击添加消息处理函数,代码如下:
void CModalModelessTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CDlgModel dlg;
dlg.DoModal(); //创建并显示模态对话框
}
(5)在ModalModelessTest.cpp的开头添加包含文件:
#include "DlgModel.h"
(6)保存工程并运行。
(7)打开“IDD_MODALMODELESSTEST_DIALOG”对话框,添加一个按钮,标题是“显示非模态对话框”。
(8)再插入一个新Dialog,把ID改为“IDD_MODELESS”,Caption属性改为“非模态对话框”,把新建的对话框上的控件都删除,然后为其添加一个类“CDlgModeless”,基类选择“CDialog”。
(9)在ModalModelessTest.cpp的开头添加包含文件:
#include "DlgModeless.h"
并定义一个全局变量:
CDlgModeless *g_dlgModeless = NULL;
(10)打开“IDD_MODALMODELESSTEST_DIALOG”对话框,对“显示非模态对话框”按钮双击添加消息处理函数,代码如下:
void CModalModelessTestDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
if (!g_dlgModeless) //如果非模态对话框对象还没创建则新建
{
g_dlgModeless = new CDlgModeless;
g_dlgModeless->Create(CDlgModeless::IDD, this); //创建非模态对话框
}
g_dlgModeless->ShowWindow(SW_SHOW); //显示非模态对话框
g_dlgModeless->SetActiveWindow();
}
(11)切换到类视图,右击CDlgModeless,选择属性,“重写”OnOK和OnCancel函数,代码如下:
void CDlgModeless::OnOK()
{
// TODO: 在此添加专用代码和/或调用基类
CDialog::OnOK();
DestroyWindow(); //销毁窗口,会发出WM_DESTROY消息
}
void CDlgModeless::OnCancel()
{
// TODO: 在此添加专用代码和/或调用基类
CDialog::OnCancel();
DestroyWindow(); //销毁窗口,会发出WM_DESTROY消息
}
(12)切换到类视图,右击CDlgModeless,选择属性,在消息页面中添加“WM_DESTROY”的响应函数OnDestroy,代码如下:
void CDlgModeless::OnDestroy()
{
CDialog::OnDestroy();
// TODO: 在此处添加消息处理程序代码
delete this;
g_dlgModeless = NULL;
}
(13)在DlgModeless.cpp的开头添加全局变量的引用:
extern CDlgModeless *g_dlgModeless;
(14)保存工程并运行,结果如下图:
下一篇: tomcat 系列一 整体架构