WM_CLOSE:关闭应用程序窗口

WM_DESTROY:关闭应用程序
WM_QUIT:关闭消息循环
只有关闭了消息循环,应用程序的进程才真正退出(在任务管理器里消失)。
win32应用程序的完整退出过程:点击窗口右上角的关闭按钮,发送WM_CLOSE消息。此消息处理中调用DestroyWindow函数,发送WM_DESTROY消息。此消息处理中调用PostQuitMessage(0)函数,发送WM_QUIT消息到消息队列中。GetMessage捕获到WM_QUIT,返回0,退出循环(应用程序真正退出)。
tips:按照上述正常流程,WM_QUIT是不会到达窗口过程的。(因为在GetMessage截获了WM_QUIT消息之后,程序已经彻底退出了!)
 
MFC应用程序的完整退出过程:点击窗口右上角的关闭按钮,或选择【File/Close】,发出 WM_CLOSE消息。CMyFrameWnd 并没有设置WM_CLOSE 处理常式,于是交给预设之处理常式。预设函数对于WM_CLOSE 的处理方式是呼叫 ::DestroyWindow, 并因而发出WM_DESTROY。预设之WM_DESTROY 处理方式是呼叫::PostQuitMessage,因此发出WM_QUIT。CWinApp::Run 收到WM_QUIT 后会结束其内部之讯息回路, 然后呼叫ExitInstance,这是CWinApp 的?个虚拟函数。如果自己应用程序累CMyWinApp 改写了ExitInstance , 那么CWinApp::Run 所呼叫的就是CMyWinApp::ExitInstance,否则就是 CWinApp::ExitInstance。最后回到 AfxWinMain,执行 AfxWinTerm,结束程序。
附加:当调用DestroyWindow函数后,操作系统就会进行一系列的删除动作,先发送WM_DESTROY消息,接着发送WM_NCDESTROY消息。如果这个窗口还有子窗口或者是其它窗口的所有者,就需要给所有子窗口发送删除消息。
WM_QUIT是唯一可以使GetMessage(&msg,NULL,0,0)返回假值的消息.
 
相关代码分析:
//主函数中进入消息循环的代码片断
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); //将消息进行处理一下
DispatchMessage(&msg); //再将消息变量msg传给windows,让windows来调用消息处理函数
}
如果把GetMessage(&msg,NULL,0,0)改为GetMessage(&msg,hWnd,0,0),则发现关闭应用程序后,任务管理器中仍有该程序的进程,且占用大量的内存,why?
msdn中的原因解释;对于GetMessage(&msg,hWnd,0,0),当第二个参数无效时,此函数返回值为-1。对于上述循环来说,此while条件为真,因此进入死循环,进程无法退出。
http://hhfighting.blog.163.com/blog/static/5570032320108215323797/
---------------------------------------------------------------------------------------------------------------
VCL里相应的代码:
  1. procedure TCustomForm.WMClose(var Message: TWMClose);
  2. begin
  3. Close;
  4. end;
  5.  
  6. procedure TCustomForm.Close;
  7. var
  8. CloseAction: TCloseAction;
  9. begin
  10. if fsModal in FFormState then
  11. ModalResult := mrCancel
  12. else
  13. if CloseQuery then
  14. begin
  15. if FormStyle = fsMDIChild then
  16. if biMinimize in BorderIcons then
  17. CloseAction := caMinimize else
  18. CloseAction := caNone
  19. else
  20. CloseAction := caHide;
  21. DoClose(CloseAction);
  22. if CloseAction <> caNone then
  23. if Application.MainForm = Self then Application.Terminate
  24. else if CloseAction = caHide then Hide
  25. else if CloseAction = caMinimize then WindowState := wsMinimized
  26. else Release;
  27. end;
  28. end;
  29.  
  30. procedure TCustomForm.WMDestroy(var Message: TWMDestroy);
  31. begin
  32. if NewStyleControls then SendMessage(Handle, WM_SETICON, , );
  33. if (FMenu <> nil) and (FormStyle <> fsMDIChild) then
  34. begin
  35. Windows.SetMenu(Handle, );
  36. FMenu.WindowHandle := ;
  37. end;
  38. inherited;
  39. end;

还有:

  1. function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
  2. var
  3. Handled: Boolean;
  4. begin
  5. Result := False;
  6. if PeekMessage(Msg, , , , PM_REMOVE) then
  7. begin
  8. Result := True;
  9. if Msg.Message <> WM_QUIT then
  10. begin
  11. Handled := False;
  12. if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
  13. if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
  14. not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
  15. begin
  16. TranslateMessage(Msg);
  17. DispatchMessage(Msg);
  18. end;
  19. end
  20. else
  21. FTerminate := True;
  22. end;
  23. end;

DestroyWindow函数来自这里(TApplication.Destroy里也调用了这个函数):

  1. procedure TWinControl.DestroyWindowHandle;
  2. begin
  3. Include(FControlState, csDestroyingHandle);
  4. try
  5. if not Windows.DestroyWindow(FHandle) then
  6. RaiseLastOSError;
  7. finally
  8. Exclude(FControlState, csDestroyingHandle);
  9. end;
  10. FHandle := ;
  11. end;

那难道每个TButton,每个TPanel,都会收到WM_DESTROY消息吗?

WM_CLOSE、WM_DESTROY、WM_QUIT学习总结(点击关闭按钮会触发WM_CLOSE消息,DestroyWindow API会触发WM_DESTROY和WM_NCDESTROY消息,MSDN上写的很清楚)的更多相关文章

  1. 2019-7-4-win10-uwp-处理用户点击关闭按钮

    title author date CreateTime categories win10 uwp 处理用户点击关闭按钮 lindexi 2019-07-04 09:28:57 +0800 2019- ...

  2. Android学习笔记点击事件和触摸事件的区别

    当我们点击手机屏幕的时候Android系统不仅会触发单击事件,还会触发触摸事件.在Android中它会先触发触摸事件,如果这个触摸事件没有被消费掉再去触发单击事件 代码示例: MainActivty. ...

  3. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

  4. abp学习(四)——根据入门教程(aspnetMVC Web API进一步学习)

    Introduction With AspNet MVC Web API EntityFramework and AngularJS 地址:https://aspnetboilerplate.com/ ...

  5. 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍

    微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...

  6. WM_CLOSE WM_DESTROY WM_QUIT的区别

    WM_CLOSE:关闭应用程序窗口 WM_DESTROY:关闭应用程序 WM_QUIT:关闭消息循环

  7. winfrom 捕获是否点击关闭按钮关闭的窗体

    const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; protected override void WndProc(ref M ...

  8. vue 点击按钮弹窗,点击关闭按钮关闭弹窗。

    <div @click="btnfc()">点击弹窗按钮</div> <div v-show="show"> <div ...

  9. OpenCV学习笔记——点击显示鼠标坐标

    点击显示鼠标显示坐标,再次点击时上一次的坐标的会消失…… #include<highgui.h> #include<cv.h> void on_mouse(int event, ...

随机推荐

  1. 浙江大学PAT上机题解析之3-05. 求链式线性表的倒数第K项

    给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式说明: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出 ...

  2. Python 30分钟入门——数据类型 &amp; 控制结构

    Python是一门脚本语言,我也久闻大名,但正真系统的接触学习是在去年(2013)年底到今年(2014)年初的时候.不得不说的是Python的官方文档相当齐全,假设你是在Windows上学习Pytho ...

  3. CloudStack全局配置參数

    參数 描写叙述 类型 默认值 account.cleanup.interval 清除用户账户所须要等待的时间(秒) 整数 86400 agent.lb.enabled If agent load ba ...

  4. [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面

    cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...

  5. N使用exus2打造企业maven仓库(三)

    假设项目中,我没有使用maven,我应该做出选择,或为项目.或者用它来推动这个项目从maven.有人会问,为什么maven?无需maven我们没有很好的操作. 这里,只说两件事情我最欣赏:第一点是管理 ...

  6. scrum经验

    Scrum是基于过程控制理论的经验方法,倡导自组织团队:其运行框架核心是迭代增量型并行开发,也是“适应性”的软件开发方法.Scrum提供了高度可视化的用于管理软件开发复杂性管理的敏捷项目管理的实践框架 ...

  7. 管理支撑办公系统技术架构选型对照讨论(J2EE与SOA对照)

    续:管理支撑办公系统技术架构选型及相关技术应用范围.方法分析 M域办公系统改造.整合涉及到OA.业务流程.部室信息站点.部室专业管理等系统和信息共享等新需求,从信息化视角来看,内容多并且杂,这里核心业 ...

  8. 百度地图SDK for Android v2.1.2全新发布

    2013年6月20日 Android SDK:V2.1.2产品上线 新增: 自定义指南针位置(类:MapController,方法:setCompassMargin) 自定义当前位置图标(类:MyLo ...

  9. Effective C++_笔记_条款01_视C++为一个语言联邦

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) C++的各种能力和特性使它成为一个无可匹敌的工具,但也可能引发某 ...

  10. JSP的学习(3)——语法知识二之page指令

    本篇接上一篇<JSP的学习(2)——语法知识一>,继续来学习JSP的语法.本文主要从JSP指令中的page指令,对其各个属性进行详细的学习: JSP指令: JSP指令是为JSP引擎而设计的 ...