模态对话框与非模态对话框

      对话框分模态对话框和非模态对话框,两者呈现的区别就是:前者获得程序的焦点,垄断用户输入;后者则相反,用户可以同时操作当前对话框和其他窗口。
     非模态对话框的设计与模态对话框基本类似,也包括设计对话框模板和设计CDialog类的派生类两部分。但是,在对话框的创建和删除过程中,非模态对话框与模态对话框相比有下列不同之处:
     1、非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是两种对话框的本质区别所在。
     至于为什么非模态对话框不会垄断用户的输入可解释如下:由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户的输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。还有一点需要清楚为什么非模态对话框通常new出来,众所周知,在MFC程序中,窗口对象的生存期应长于对应的窗口,也就是说,不能在未DestroyWindow的情况下先把对应的窗口对象delete。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对话框对象,而不能以局部变量的形式来构建之。
      2、关闭非模态对话框时需要调用DestroyWindow销毁窗口(模态对话框会调用CDialog::EndDialog),调用delete删除窗口对应的对话框对象。一般来说,有两种方式销毁窗口和删除对象:
      第一种:外部方式——在拥有非模态对话框的程序退出时显式调用DestroyWindow和delete完成窗口的销毁和删除,适用于非模态对话框创建一次在程序退出才需要销毁的情况;
      第二种:内部方式——重写OnOk和OnCancel函数并在函数中调用DestroyWindow,同时在CWnd::PostNcDestroy中delete对象,适用于多次重复创建非模态对话框的情况。其实,重不重写确定和取消这两个函数示情况而定,关键是要有DestroyWindow的过程。

你可能感兴趣的:(delete,mfc)