对于模态对话框的显示是利用对话框类的DoModal()函数实现的,调用了该函数时,就创建了一个对话框并显示。一旦模态对话框被创建并显示出来,它就进入一个消息循环。此时模态对话框会将接收到的消息分发给需要接收此类消息并进行处理。
而非模态对话框使用对话框类的ShowWindow(SW_SHOW)来显示对话框,而不是使用DoModal()函数,一般情况下,非模态对话框的对象需要利用new操作符进行动态的创建对话框对象。当然C++语言中,对于利用new操作符创建的内容需要使用delete操作符进行销毁。对于动态创建的对话框对象同样需要在关闭对话框时利用delete进行销毁。
说了这么多了,相信大家已经懂了模态和非模态对话框的基本情况,那么在VC中是如何实现的呢,下面就来细细说明
(1)、模态对话框的实现
新建一个基于对话框的应用程序Test,在资源视图中右键点击Dialog,在弹出菜单中选择“InertDialog”,然后根据类向导新建一个对话框相关的类dlg1
添加主对话框上与确定键相对应的消息响应函数,实现模态对话框的显示,代码如下:
voidCTestDlg::OnOK()
{
//TODO:Addextravalidationhere
dlg1dlg;
intresult=dlg.DoModal();//调用对话框类的成员函数
if(result==IDOK)
AfxMessageBox("单击确定按钮");
else
AfxMessageBox("单击取消按钮");
CDialog::OnOK();
}
编译运行便可实现模态对话框的显示了
(2)、非模态对话框的实现
新建一个基于对话框的应用程序Test,在资源视图中右键点击Dialog,在弹出菜单中选择“InertDialog”,然后根据类向导新建一个对话框相关的类dlg1,
在CTestDlg类前面添加dg1的声明语句,如下所示:
classdlg1;
classCTestDlg:publicCDialog
{
..........
然后在CTestDlg中添加一个变量:dlg1*pdlg;并且在CTestDlg的构造函数中初始化为NULL,而且要在TestDlg.CPP的前面加上头文件#include"dlg1.h"
然后添加主对话框确定按钮的消息映射,代码如下
voidCGeliangDlg::OnOK()
{

//TODO:Addextravalidationhere
if((pdlg!=NULL)&&::IsWindow(pdlg->m_hWnd))//判断对话框是否已被创建
{
AfxMessageBox("对话框已经被创建");
pdlg->ShowWindow(SW_SHOW);//已被创建,直接显示
}
else
{
pdlg=newdlg1();//没有被创建,则创建对象
}
if(!::IsWindow(pdlg->m_hWnd))
{
pdlg->Create(IDD_DIALOG1,this);//创建对话框
pdlg->ShowWindow(SW_SHOW);//显示对话框
}
//CDialog::OnOK();
}
在添加内存清理函数,
在类视图中右击dlg1,选中AddVirtualFunction,弹出NewVirtualOverrrideforclassdlg1对话框,选择PostNcDestroy,单击AddHandler按钮,单击EditExiting按钮,编写代码如下:
voiddlg1::PostNcDestroy()
{
//TODO:Addyourspecializedcodehereand/orcallthebaseclass
deletethis;
//CDialog::PostNcDestroy();
}
至此已经完成了非模态对话框的显示与销毁了。