程序的启动和退出是要讲究顺序的,实则就是一个栈式的过程,比如你启动一个SDI程序或者MDI程序,先启动APP,再分别启动MainFrm,ChildFrm,以及View。这几者之间是有相互依赖关系的。可以想象,当你要退出一个程序时,你得反过来分别退出View,ChildFrm,MainFrm,最后才是App。
所以,你在View里使用DestroyWindow()导致这种顺序打乱了,所以才出现程序崩溃的错误。
给你补补吧,MDI程序退出顺序如下:
1、当框架CFrameWnd关闭时,会接收到WM_CLOSE消息,通过消息映射会执行OnClose方法;
2、在OnClose方法中,由于框架是应用程序的主窗口,因此会调用应用程序的CloseAllDocuments方法;
3、应用程序的CloseAllDocuments调用了文档管理器的CloseAllDocuments方法;
4、文档管理器的CloseAllDocuments方法调用了文档模板的CloseAllDocuments方法;
5、在文档模板的CloseAllDocuments方法中,调用了文档的OnCloseDocument方法;
6、在文档对象的OnCloseDocument方法中,调用了框架的DestroyWindow方法,而框架的DestroyWindow方法直接调用了CWnd的DestroyWindow方法释放窗口;
7、在窗口类CWnd的DestroyWindow方法中,调用了API函数DestroyWindow释放窗口。该函数会向窗口发送WM_DESTROY消息,执行视图类的OnDestroy方法,接着释放掉视图窗口,在视图窗口被释放后,向视图窗口发送最后一个窗口消息WM_NCDESTROY,执行视图的PostNcDestroy方法;
8、PostNcDestroy方法中的“delete this;”最终会调用视图的析构函数释放掉视图对象。
通过以上可知,过早地执行DestroyWindow违反了这一顺序;利用楼上所述,使用AfxGetMainWnd()->SendMessage(WM_CLOSE); 就应该不会有问题了。
点击后它本来就会调用
afx_msg void OnBnClickedCancel()
把
CDialogEx::OnCancel();
写回就好了
如果是防止空格和Enter退出程序,
用preTranslateMessage函数对键盘的Enter和空格键按下的消息进行拦截!
视窗程序一般不应当在CView中退出整个程序。
应当在CWinApp用
CWinApp::OnAppExit 退出。
改写OnAppExit:
ON_COMMAND(ID_APP_EXIT, OnAppExit)
真想关掉程序,揿窗右上角的叉叉框就可以了。
以上就是关于我用MFC构建了一个窗口程序,现在想通过按下键盘上的Q键就能关闭窗口,退出程序,应怎样实现全部的内容,包括:我用MFC构建了一个窗口程序,现在想通过按下键盘上的Q键就能关闭窗口,退出程序,应怎样实现、MFC对话框点击右上角×和退出button没法关闭窗体,反而程序中断、MFC在视类中如何退出程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)