mfc关闭模态对话框,mfc关闭对话框
很简单。当一个对话框关闭时,要依次调用这个类的destroy window-on destroy-postncdestore。根据关闭方法的不同,将在这些函数之前调用OnOK、OnCancle或OnClose。
这里我想说的是,模态对话框的消息循环直到PostNcDestroy被调用才会真正结束,也就是ContinueModal循环不会在这里结束,然后调用类的析构函数,这个对话框才会真正被销毁。
如果一个模态对话框有一个模态子对话框,你就要多加注意了。如果父对话框由于某种原因关闭,而子对话框仍然显示(例如,从其他线程接收到WM_CLOSE消息),父对话框将等待,直到子对话框被销毁,并将继续执行自己的关闭过程,如第一段所述。
今天的问题是子对话框的指针保存在父对话框中。为了让主对话框先关闭所有子窗口,在父对话框的OnClose中调用delete pDlgChld,程序直接崩溃。后来改成在删除之前给子对话框发一个WM_CLOSE消息,但还是崩溃了。我也试着发了WM_DESTROY和音调对话框的DestroyWindows,但是没用。看了上面的说明,这里应该清楚了。程序处理完这些消息后,子对话框继续其模式循环。这个时候删除对象肯定会导致崩溃。
解决方案其实很简单。将子对话框指针的删除移动到OnClose之后的任何函数,这样就不会崩溃了。因为执行OnClose后父对话框会一直等到其子对话框结束,所以执行OnClose后的函数时子对话框的生命就已经结束了,所以删除指针不会有问题。
其实我们最好不要改变MFC对这个机制的处理,这样对资源的管理也是最合理的。