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

来源:互联网 发布: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定义出错,不知道问题在哪?

原创粉丝点击