首页 > 代码库 > 窗口关闭的消息路由

窗口关闭的消息路由

有时候当我们点击窗口右上角的关闭按钮时,窗口在关闭之前会弹出一个提示对话框,

询问我们是否真的要关闭窗口 。当我们点击确定以后,窗口会正常关闭,否则一切如常。

那么上面的功能是如何实现的呢?

让我们先来了解一下窗口关闭时的消息路由:

首先当我们点击关闭按钮后,窗口会发出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();
}