处理WM_CLOSE消息,CYourDlg::OnClose()
{
if(::MessageBox(NULL, 确定要退出吗?","程序退出", MB_YESNO) == IDYES)
{
CDialog::OnCLose();
}
}
打开MFC ClassWizard,在 CXXXApp类里重载ExitInstance方法
重载OnLButtonDown函数,判断鼠标点击的位置,是就退出,给自己发送消息PostMessage(WM_CLOSE,0,0);
函数说明如下
CWnd::OnLButtonDown
afx_msg void OnLButtonDown( UINT nFlags, CPoint point );
参数: nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一:
·MK_CONTROL如果CTRL键被按下,则设置此位。
·MK_LBUTTON如果鼠标左键被按下,则设置此位。
·MK_MBUTTON如果鼠标中键被按下,则设置此位。
·MK_RBUTTON如果鼠标右键被按下,则设置此位。
·MK_SHIFT如果SHIFT键被按下,则设置此位。
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。
说明:当用户按下鼠标左键时,框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现,则该实现将使用最初传递给消息的参数(而不是你提供给这个函数的参数)。
请参阅:CWnd::OnLButtonDblClk, CWnd::OnLButtonUp, WM_LBUTTONDOWN
程序的启动和退出是要讲究顺序的,实则就是一个栈式的过程,比如你启动一个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); 就应该不会有问题了。
你检查一下,在程序的某个地方,是不是在清除内存(删除对象)时,删除了不存在的对象;或者,对无效的指针(对象)变量进行了 *** 作。
因为,在不同的电脑环境下,有些指针(或变量)会无效。
对于CheckBytes函数,你重点检查char pb是否有效。
你要做的程序是类似于某个软件的安装向导一类的程序么,你可以做一个主窗口,然后做若干子窗口,子窗口设置成没有边框的 也就是子窗口的Border 选项设置为none,然后子窗口贴到主窗口上,通过贴不同的子窗口达到目的。
销毁窗口的函数是DestroyWindow();但是它会销毁主窗口所拥有的子窗口并且导致程序退出。
你也可以试试把子窗口的Style 设置成 Overlapped这样子窗口就相对独立了。
以上就是关于MFC或vc编译环境下,如何实现点击关闭按钮时d出关闭对话框全部的内容,包括:MFC或vc编译环境下,如何实现点击关闭按钮时d出关闭对话框、MFC中退出程序的函数写在那个类中起作用、我用MFC构建了一个窗口程序,现在想通过按下键盘上的Q键就能关闭窗口,退出程序,应怎样实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)