有时候当我们点击窗口右上角的关闭按钮时,窗口在关闭之前会弹出一个提示对话框,
询问我们是否真的要关闭窗口 。当我们点击确定以后,窗口会正常关闭,否则一切如常。
那么上面的功能是如何实现的呢?
让我们先来了解一下窗口关闭时的消息路由:
首先当我们点击关闭按钮后,窗口会发出WM_SYSCOMMAND消息,此消息会交由默认的消息处理函数处理,
默认的消息处理函数会发出WM_CLOSE消息。该消息会由默认消息处理函数调用DestroyWindow()处理,
DestroyWindow()用来销毁窗口,也就是说让窗口从我们眼前消失。DestroyWindow()又会发出
WM_DESTROY消息,注意此消息为不进队消息,会直接发给它的消息处理函数处理即默认消息处理函数。
默认消息处理函数会调用PostQuitMessage()处理该消息,并发出WM_QUIT消息。当消息循环接受到此
消息时会中止消息循环,进而退出应用程序。
我们可以利用上面的消息路由实现我们开始提到的功能,消息路由中有两个消息最有利用价值WM_CLOSE和
WM_DESTROY,那我们该拦截哪个呢?很多人会选择后者,但是WM_DESTROY消息发出时,窗口已经没了!
所以我们应该拦截WM_CLOSE消息。
下面分别是基于对话框核单文档的程序处理
对话框:
给对话框添加一个WM_CLOSE消息处理函数,在该函数中处理
void CProgramDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(IDOK==MessageBox("你真的要关闭窗口吗?","小提示",
MB_OKCANCEL|MB_ICONINFORMATION))
CDialog::OnClose();
}
单文档:
给单文档添加一个WM_CLOSE消息(框架窗口)处理函数,在该函数中处理,
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(IDOK==MessageBox("你真的要关闭窗口吗","小提示",
MB_OKCANCEL|MB_ICONEXCLAMATION))
CFrameWnd::OnClose();
}