WM_CLOSE、WM_DESTROY、WM_QUIT区别
2015-09-01 09:39
1051 查看
窗口关闭过程:
一般是响应WM_CLOSE,调用DestroyWindow();
DestroyWindow()又发送WM_DESTROY;
响应WM_DESTROY,调用PostQuitMessage();
PostQuitMessage()又发送WM_QUIT;
GetMessage()发现WM_QUIT,退出程序。
WM_CLOSE 是关闭窗口
WM_DESTROY 是关闭程序
WM_QUIT 是关闭消息环
GetMessage得到WM_QUIT后就会返回FALSE,从而结束消息循环,最后进程结束,程序退出。
有三个消息看起来差不多,都是处理关闭的事情的,它们是WM_CLOSE,WM_DESTROY,和WM_QUIT。它们的确很相似,但你需要知道它们之间的不同!一个窗口或者应用程序应该被关闭时发出WM_CLOSE消息,当接收到WM_CLOSE消息时,如果你愿意,可以向用户提出是否真的要退出。你知道让用户作确认或有错误出现或有什么应该注意的事情发生的时候,往往弹出一个消息框。
插播:消息框
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掉的情况。
5. PostQuitMessage是向系统发出要终止线程的请求,在终止线程前系统还要做些内存的清理工作。
我们关闭一个程序时是发送WM_CLOSE消息(函数SendMessage?),然后调用DestroyWindow函数,调用DestroyWindow时系统会向程序发WM_DESTROY消息,终止整个程序。
*****************************************************************************************************************************************
[align=center]一个对话框向另一个对话框发窗口关闭消息[/align]
对话框A CADlg ; 对话框B CBDlg
A中声明B为成员变量 CBDlg m_BDlg;
A发送消息关闭B :SendMessage(m_BDlg.GetSafeHwnd(), WM_CLOSE, 0, 0);
或者直接:m_BDlg.SendMessage(WM_CLOSE);
******************************************************************************************************************************************
一般是响应WM_CLOSE,调用DestroyWindow();
DestroyWindow()又发送WM_DESTROY;
响应WM_DESTROY,调用PostQuitMessage();
PostQuitMessage()又发送WM_QUIT;
GetMessage()发现WM_QUIT,退出程序。
WM_CLOSE 是关闭窗口
WM_DESTROY 是关闭程序
WM_QUIT 是关闭消息环
GetMessage得到WM_QUIT后就会返回FALSE,从而结束消息循环,最后进程结束,程序退出。
有三个消息看起来差不多,都是处理关闭的事情的,它们是WM_CLOSE,WM_DESTROY,和WM_QUIT。它们的确很相似,但你需要知道它们之间的不同!一个窗口或者应用程序应该被关闭时发出WM_CLOSE消息,当接收到WM_CLOSE消息时,如果你愿意,可以向用户提出是否真的要退出。你知道让用户作确认或有错误出现或有什么应该注意的事情发生的时候,往往弹出一个消息框。
插播:消息框
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掉的情况。
5. PostQuitMessage是向系统发出要终止线程的请求,在终止线程前系统还要做些内存的清理工作。
我们关闭一个程序时是发送WM_CLOSE消息(函数SendMessage?),然后调用DestroyWindow函数,调用DestroyWindow时系统会向程序发WM_DESTROY消息,终止整个程序。
*****************************************************************************************************************************************
[align=center]一个对话框向另一个对话框发窗口关闭消息[/align]
对话框A CADlg ; 对话框B CBDlg
A中声明B为成员变量 CBDlg m_BDlg;
A发送消息关闭B :SendMessage(m_BDlg.GetSafeHwnd(), WM_CLOSE, 0, 0);
或者直接:m_BDlg.SendMessage(WM_CLOSE);
******************************************************************************************************************************************
相关文章推荐
- UITableViewCell分割线从最左边开始和分割线颜色设置
- easyUI的datagrid控件日期列不能正确显示Json格式数据的解决方案
- UITableViewCell高度计算
- UI UIWindow / bounds / frame
- iOS中uiimage和uicolor相互转化
- request.getRemoteUser() 方法
- priority_queue的用法
- 如何在高并发分布式系统中生成全局唯一Id
- UI:触摸事件 与 事件的回应
- UEFI Bootable USB Flash Drive - Create in Windows(WIN7 WIN8)
- Install and run DB Query Analyzer 6.04 on Microsoft Windows 10
- Install and run DB Query Analyzer 6.04 on Microsoft Windows 10
- APUE《UNIX 环境高级编程》读后感
- iOS_8_API:UITableViewRowAction
- NGUI实现翻牌效果
- 使用Qt Style Sheets制作UI特效
- 在UITableView中插入或者删除指定的行(或者节)
- SSRS 2012 Metro UI 高端报表视频教程【全国首家】
- MySQL树形查询结果封装成Json格式,返回给easyui treegrid
- WebMVC中EasyUI的ComboBox控件的运用