在写MFC程序(单对话框程序)时发现,如果删除了取消按钮,那这个程序就没有关闭的方法了,如果想实现点击右上角叉号关闭程序就不行了,因为右上角的×号只能关闭Windows窗口不能关闭你的进程。
我在网上差了一下午,下面是我的解决方案
WM_CLOSE:
在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮,你的窗口过程就会收到WM_CLOSE。DefWindowProc对WM_CLOSE的处理是调用DestroyWindow。当然,你可以不让DefWindowProc处理,而是自己处理,例如询问用户是否保存更改等。如果用户选择“取消”,
你忽略此消息,那么程序照常运行;如果用户确认要退出,你就调用DestroyWindow。
WM_DESTROY:
接下来,DestroyWindow完成窗口的清理工作,最后像窗口过程发送WM_DESTROY。对于 WM_DESTROY,DefWindowProc不会处理。也就是说,你如果不处理这个消息,虽然你的窗口已经销毁,但进程并不会结束。一般处理 WM_DESTROY时都是释放资源(例如申请的内存等),
然后调用PostQuitMessage。
WM_QUIT:
PostQuitMessage会发送WM_QUIT给消息队列。注意,WM_QUIT永远不会到达窗口过程,因为GetMessage得到WM_QUIT后就会返回FALSE,从而结束消息循环,最后进程结束,程序退出。
假设使用者执行HELLOWIN,并且使用者最终单击了 Close按钮,或者假设用键盘或鼠标从系统菜单中选择了Close,DefWindowProc处理这一键盘或者鼠标输入,在检测到使用者选择了Close选项之后,它给窗口消息处理程序发送一条WM_SYSCOMMAND消息。WndProc将这个消息
传给DefWindowProc。 DefWindowProc给窗口消息处理程序发送一条WM_CLOSE消息来响应之。WndProc再次将它传给DefWindowProc。 DestroyWindow呼叫DestroyWindow来响应这条WM_CLOSE消息。DestroyWindow导致Windows给窗口消息处理程序发送一条WM_DESTROY消息。WndProc再呼叫PostQuitMessage,将一条WM_QUIT消息放入消息队列中,以此来响应此消息。这个消息导致WinMain中的消息循环终止,然后程序结束。
言而简之:
(1)用户点击退出按钮,发送了WM_CLOSE消息
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()
(3)在DestroyWindow()中发送了WM_DESTROY消息
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环
综上,程序先调用OnClose()(也可能不调用),然后调用OnDestroy()(必调用),
所以,如果要进行程序结束时的清理工作,应该在OnDestroy()中,而不是在OnClose(),否则就有可能会出现内存泄漏的危险了!
这个就是大概原理,我们点击叉号系统会调用ON_WM_CLOSE()消息
我删除了取消按钮所以系统一开始删除了我的消息
我在 我的工程的 XXXDLg.H文件中声明了我自己的OnClose()函数
Public://最好定义为公共防止报错
void OnClose();
在我的XXXDLg.c中写函数
void CROBOTDlg:: OnClose() { if(MessageBox(("真的想退出?"),("确认退出"),MB_OK )==IDOK) { close_cmare=1; Sleep(100); DestroyWindow(); exit(0);//一般不要写这句话,除非你的程序怎么样都不能关闭,否则用这句话使程序强制退出 } }点击打开链接谢谢这位网友的分享解决了我的问题哦