一般是响应WM_CLOSE,调用DestroyWindow()
DestroyWindow()又发送WM_DESTROY
响应WM_DESTROY,调用WM_QUIT
GetMessage()发现WM_QUIT,退出程序
插播:消息框
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);
1. 当收到WM_CLOSE消息,你可以做两件事儿。一件是你接受默认的处理并返回一个值,你若这样做了,应用程序或窗口按照计划关闭;或者,你返回0,应用程序或窗口将保持原样。以下是代码的基本部分:
if (msg == WM_CLOSE)
{
if (MessageBox(hMainWindow, "Are you sure want to quit?", "Notice", MB_YESNO | MB_ICONEXCLAMATION) == IDNO)
return(0);
// otherwise, let the default handler take care of it
}
2. WM_DESTROY消息有点儿不同,它是窗口正在关闭时发出的。当收到WM_DESTROY消息的时候,窗口已经从视觉上被删除;但一个主窗口被关闭,并不意味着应用程序结束了,因为它可以在没有窗口的条件下继续运行。
3. 然而,当一个用户关闭了主窗口,并希望这意味着是要结束应用程序时,如果你希望真的这么做,那么在收到WM_DESTROY消息的时候,你必须发出一个WM_QUIT消息。
4. WM_QUIT是应用程序结束发出的消息,一般可以看成进程被kill掉的情况。
A中声明B为成员变量 CBDlg m_BDlg;
A发送消息关闭B :SendMessage(m_BDlg.GetSafeHwnd(), WM_CLOSE, 0, 0);
或者直接:m_BDlg.SendMessage(WM_CLOSE);
*********************************************************************************************************************************************************************************
下面程序执行时出错
void
{
CMDIFrameWnd::OnClose();
CDocument
doc=this->GetActiveDocument();
}
下面程序执行时不出错,
void
{
CDocument
doc=this->GetActiveDocument();
CMDIFrameWnd::OnDestroy();
}
原因分析:
WM_CLOSE是在窗口关闭前发送的,你还可以决定是否真的关闭窗口
WM_DESTROY是在窗口关闭过程中发送的,窗口已被移出屏幕
你的程序的错误在于调用
被Destroy掉了,this指针指向的窗口对象已经不存在了,所以出错
也就是处理顺序是先处理WM_CLOSE(窗口未关闭),后处理WM_DESTROY(窗口已关闭)
CMDIFrameWnd::OnClose();后的部分不执行,如需要执行,可放到OnDestroy()中,即你的第二段
调用父类缺省处理
WM_DESTROY消息将窗口destroy了,所以OnDestroy中this指针还可以用,
等出了CMDIFrameWnd::OnClose()后this指针指向的窗口对象已经不存在了
void
{
CDocument
doc=this->GetActiveDocument();
CMDIFrameWnd::OnClose();
}
将不出错
下面程序执行时出错,
void
{
CMDIFrameWnd::OnDestroy();
CDocument
doc=this->GetActiveDocument();
}
原因如下:
OnClose()中调用DestoryWindow(),而DestoryWindow()中发送