分类:
模态对话框工作状态:当它获得焦点时,将垄断用户的输入,在完成本对话框之前,用户无法对本程序的其他部分进行操作。
非模态对话框类似于WORD里的查找替换,就在应用程序打开非模态对话框的同时还可以切换到其他窗口进行操作。
二者的类都派生于CDialog类,而CDialog类派生于CWnd类。
区别:
模态对话框使用CDialog::DoModal函数创建以及销毁。初始化消息WM_INITDIALOG,调用OnInitDialog初始化并显示,创建完毕后,DoModal启动消息循环。DoModal运行时候,程序会停止在新对话框的消息循环函数中,不执行其他线程程序。
创建模态对话框:
dig1 mark;
if(mark.DoModal()==IDOK){
}
return FALSE;
非模态对话框使用CDialog::Create实现。由于Create函数不会启动新的消息循环,对话框与应用程序共用一个消息循环,就不会独占用户输入,Create函数在对话框显示后就立即返回。DoModal是在对话框关闭后才返回。对话框关闭后说明对话框窗口的对象已经销毁,只剩下C++对象还没有释放,所以必须调用CWnd::DestoryWindows函数来关闭非模态对话框。
开启非模态对话框方法:注意一点,非模态对话框需要全局对象,否则对象内存会被撤销,在生命周期结束的时候。
dig1 mark;
mark.Create(IDD_CLASS_ID,this);
mark.ShowWindow(SW_SHOW);
这里注意一点:因为关闭非模态对话框的同时,只是隐藏了对话框,没有销毁创建的对话框的资源,所在再次创建的时候,会报错。
void Cdlg::OnOk()
{
if(!IsWindow(m_Dlg,m_hWnd))//是否关联了对话框
{
mdlg.Create(IDD_CLASS_ID,this);//创建非模态对话框
}
m_Dlg.ShowWindow(SW_SHOW);//显示非模态对话框
}
撤销非模态对话框方法:
mark.DestoryWindow();
模态对话框的创建
环境:VC6.0/VS2005
功能:程序界面出现之前弹出一个密码对话框,输入密码,密码正确继续执行,密码错误程序终止。
VC6.0
![](https://i-blog.csdnimg.cn/blog_migrate/c5003be45e3fa78c1186b341bbb0ad1c.bmp)
Dialog里new一个新的对话框