模态对话框与非模态对话框的区别
来源:互联网 发布:win8打开网络快捷键 编辑:程序博客网 时间:2024/05/16 09:34
最近几天一直在研究这个问题,起初一直都是在用模态对话框,然而在一个对话框中打开另外一个模态对话框时,一直都无法将值传递给该模态对话框,今天早上将模态对话框改成了非模态对话框,问题竟然解决了。于是决定将它们之间的区别写下来。 首先来说说模态对话框,模态对话框是对话框中最常见的,使用范围很广泛,如果是模态的,那么弹出后该程序的其它窗口就呈不可用的状态,原来程序暂停执行,直到这个模态窗口关闭后才回到原来程序继续。其用法为: 接下来说说非模态对话框,非模态的就是直接显示出来,然后原来的程序继续执行下面的语句,而且其它窗口也呈可用状态。其用法如下: 网上常见的创建非模态对话框的方法如下:
CMyDlg dlg;
dlg.DoModal(); //此处的DoModal()函数实现的功能是创建并显示对话框
CMyDlg dlg;
dlg.Create(IDD_XX); //其中IDD_XX为该非模态对话框的ID
dlg.ShowWindow(SW_SHOW);
/*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/
CTestDlg *dlg=new CTestDlg;
dlg-> Create(IDD_TEST_DLG,NULL);
dlg-> ShowWindows(SW_SHOW);
在上面的代码中我们新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁),而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。可以用如下方法:
在对话框退出时销毁自己:在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下:
void CTestDlg1::OnOK()
{
CDialog::OnOK();
DestroyWindow();
}
void CTestDlg1::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
void CTestDlg1::OnDestroy()
{
CDialog::OnDestroy();
delete this;
}
可是我用这种方法动态分配地址,老是出问题,提示dlg定义出错,不知道问题在哪?
- 模态对话框与非模态对话框 的区别
- 关于模态对话框与非模态对话框的区别
- 模态对话框与非模态对话框的区别(转)
- 模态对话框与非模态对话框的区别
- 模态对话框与非模态对话框的区别
- 模态对话框与非模态对话框的区别
- 模态对话框与非模态对话框的区别
- 非模态对话框与模态对话框的区别
- C# WinForm 模态对话框与非模态对话框的区别
- MFC模态对话框与非模态对话框的区别总结
- MFC模态对话框与非模态对话框的区别
- 模态对话框与非模态对话框的区别
- 模态对话框与非模态对话框的创建及的几种销毁方法与区别
- 模态对话框和非模态对话框的区别
- 关于“模态对话框”和“非模态对话框”的区别
- 模态对话框和非模态对话框的区别1
- 模态对话框和非模态对话框的区别2
- 系统处理非模态对话框和模态对话框的区别
- .NET 导入EXCEL后数值型toString会变成空问题
- web core 基础框架
- IE8下按钮变小的解决方案
- 怎么查看和获取SQL Server实例名
- php与mssql存储过程的返回值
- 模态对话框与非模态对话框的区别
- 图片特效处理
- FreeMicaps开发讲解二: 图层
- Tcpdump的使用
- WCF从理论到实践(5):Binding细解
- oracle jobs
- JavaScript Cookies ,cookie 用来识别用户。
- 今日任务-遗留问题
- tomcat 如何把请求(request)映射到servlet