WM_CLOSE、WM_QUIT、WM_DESTROY区别

扫地机器人设计与实现——基于嵌入式系统的智能家居解决方案 本文介绍了基于嵌入式技术的扫地机器人设计与实现。通过利用STM32单片机、传感器、驱动系统等硬件组件,并结合路径规划与控制算法、远程控制等软件技术,设计出了一款具有智能避障、路径规划、自动充电等功能的扫地机器人。系统的开发不仅提高了清洁效率,也为进一步研究和优化扫地机器人提供了实践基础。 阅读详情

WM_DESTROY 是关闭程序的
WM_CLOSE 是关闭窗口的
WM_QUIT 是关闭消息环的

    以下说明程序是如何退出的:
    使用者选按【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,结束程序。

WM_CLOSE,调用DestroyWindow()
DestroyWindow()又发送WM_DESTROY
响应WM_DESTROY,调用WM_QUIT
GetMessage()发现WM_QUIT,退出程序

特别注意:如果想手动发送WM_QUIT只能使用postmessage函数,而不能使用sendmessage函数

---

//主函数中进入消息循环的代码片断
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); //将消息进行处理一下
DispatchMessage(&msg); //再将消息变量msg传给windows,让windows来调用消息处理函数
}

//消息处理函数
LRESULT CALLBACK MyProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{

      case WM_CLOSE:

                if(IDOK==MessageBox(hwnd,"真的想退出程序吗?","退出程序就没机会了",MB_YESNO))

                {

                        DestroyWindow(hwnd); //WM_CLOSE默认是调用这个处理函数

                }

                break;

               case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

---


WM_CLOSE消息:在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮时产生,它的默认响应函数是直接调用DestroyWindow(hwnd);
DestroyWindow(hwnd); 是销毁窗口(但没有不是退出消息循环),然后销毁过程中会产生WM_DESTROY消息放入消息队列,

(当调用DestroyWindow函数后,操作系统就会进行一系列的删除动作,先发送WM_DESTROY消息,接着发送WM_NCDESTROY消息。如果这个窗口还有子窗口或者是其它窗口的所有者,就需要给所有子窗口发送删除消息。)

 

WM_DESTROY消息:默认是调用PostQuitMessage(0),ostQuitMessage(0)作用是产生WM_QUIT并放入消息队列,

WM_QUIT消息:GetMessage(&msg,NULL,0,0)拿到WM_QUIT后返回假,导致消息循环退出.WM_QUIT是唯一可以使GetMessage(&msg,NULL,0,0)返回假值的消息.

 

 

 

-------------------------------------------------------------------------------------------------------

 

WM_CLOSE:

  在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮,你的窗口过程就会收到WM_CLOSE。DefWindowProc对 WM_CLOSE的处理是调用DestroyWindow。当然,你可以不让DefWindowProc处理,而是自己处理,例如询问用户是否保存更改 等。如果用户选择“取消”,你忽略此消息,那么程序照常运行;如果用户确认要退出,你就调用DestroyWindow。


WM_DESTROY:

  接下来,DestroyWindow完成窗口的清理工作,最后像窗口过程发送WM_DESTROY。对于 WM_DESTROY,DefWindowProc不会处理。也就是说,你如果不处理这个消息,虽然你的窗口已经销毁,但进程并不会结束。一般处理 WM_DESTROY时都是释放资源(例如申请的内存等),然后调用PostQuitMessage。

 

WM_QUIT:

  PostQuitMessage会发送WM_QUIT给消息队列。注意,WM_QUIT永远不会到达窗口过程,因为GetMessage得到WM_QUIT后就会返回FALSE,从而结束消息循环,最后进程结束,程序退出。

 

 

假设使用者执行HELLOWIN,并且使用者最终单击了 Close按钮,或者假设用键盘或鼠标从系统菜单中选择了 Close, DefWindowProc处理这一键盘或者鼠标输入,在检测到使用者选择了Close选 项之后,它给窗口消息处理程序发送一条WM_SYSCOMMAND消息。WndProc将这个消息传给DefWindowProc。 DefWindowProc给窗口消息处理程序发送一条WM_CLOSE消息来响应之。WndProc再次将它传给DefWindowProc。 DestroyWindow呼叫DestroyWindow来响应这条WM_CLOSE消息。DestroyWindow导致Windows给窗口消息处 理程序发送一条WM_DESTROY消息。WndProc再呼叫PostQuitMessage,将一条WM_QUIT消息放入消息队列中,以此来响应此 消息。这个消息导致WinMain中的消息循环终止,然后程序结束。

转载地址:http://appdev.189works.com/?action-viewnews-itemid-2590

***********************************************

WM_CLOSE消息与DefWindowProc收到WM_SYSCOMMAND消息,且wParam等于SC_COLSE时发送给窗口过程的消息相同。

  如果在一个Windows程序的系统菜单图标上双击一下,那么程序将会终止。双击产生一系列的WM_NCHITTEST消息。由于鼠标定位在系统菜单图标上,因此DefWindowProc将返回HTSYSMENU的值,并且Windows把wParam等于HTSYSMENU的WM_NCLBUTTONDBLCLK消息放在消息队列中。

  当DefWindowProc接收到wParam参数等于HTSYSMENU的WM_NCLBUTTONDBLCLK消息时,它就把wParam参数等于SC_CLOSE的WM_SYSCOMMAND消息放入消息队列中(这个WM_SYSCOMMAND消息是在用户从系统菜单中选择Close时产生的)。同样,窗口过程也把这个消息传给DefWindowProc。DefWindowProc通过给窗口过程发送WM_CLOSE消息来处理该消息。

  如果一个程序在终止之前要求来自用户的确认,那么窗口过程就需要捕获WM_CLOSE,否则DefWindowProc调用DestroyWindow函数来处理WM_CLOSE。除了其他处理,DestroyWindow还给窗口过程发送一个WM_DESTROY消息。窗口过程通常用下列代码来处理WM_DESTROY消息:

  case WM_DESTROY:

    PostQuitMessage(0);

    return 0;

  PostQuitMessage使Windows把WM_QUIT消息放入消息队列中,此消息永远不会到达窗口过程,因为它使GetMessage返回0,终止消息循环,从而也终止了程序。

  AskConfirmation(HWND hwnd)

  {

    return MessageBox(hwnd, TEXT("Really want to close PopPad2?"), szAppName, MB_YESNO | MB_ICONQUESTION);

  }

  case WM_CLOSE:

    if(IDYES == AskConfirmation(hwnd))

      DestroyWindow(hwnd);

    return 0;

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/tg5156/archive/2010/07/07/5719795.aspx

2026年医疗AI的可信革命全栈实现(上) 医疗AI可信化:贝叶斯网络与向量数据库的协同架构 本文探讨2026年医疗AI发展的关键转折点——从追求生成能力转向构建可信决策系统。核心观点认为,医疗AI下一阶段的竞争焦点在于不确定性量化和错误传播约束,而非单纯的问答流畅度。研究提出以Python为开发语言、结合向量数据库与贝叶斯网络的混合架构: 技术分层 语言层(LLM):处理自然语言交互与工具调用 证据层(Milvus/Qdrant):实现可审计的临床知识检索 概率层(pgmpy/PyMC):执行贝叶斯推理与风险路由 治理层:确保权限控制与人工复核机制 阅读详情

相关推荐

【算法】—前缀和与差分详解

前缀和指一个数组的某下标之前的所有数组元素的和(即数列的前n项求和),前缀和是一种重要的预处理,能够降低算法的时间复杂度,可以快速地求出某一段的和,对于处理区间之间的问题是往往十分高效相比较其他算法而言,前缀和更像是一种解题的技巧,一种优化方式输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和5 32 1 3 6 41 21 32 4123453610。

DAY I 的成长之路 6022

WM_QUIT WM_CLOSE 区别

WM_CLOSE:关闭应用程序窗口 WM_DESTROY:关闭应用程序 WM_QUIT:关闭消息循环 只有关闭了消息循环,应用程序的进程才真正退出(在任务管理器里消失)。 Win32应用程序的完整退出过程:点击窗口右上角的关闭按钮,发送WM_CLOSE消息。此消息处理中调用DestroyWindow函数,发送WM_DESTROY消息。此消息处理中调用PostQuitMessage(0)函数,发送WM_QUIT消息到消息队列中。GetMessage捕获到WM_QUIT,返回0,退出循环(应用程序真正退出)。

程序员小哈的专栏 926

电动转向系统 TAS 传感器

靠扭杆变形测力气,用霍尔效应算角度,借 ECU 给电机发指令。它就像 EPS 系统的 "神经末梢",把驾驶员的操作意图转化成电信号,再通过电机变成实实在在的助力,让我们开车既省力又安全。下次转动方向盘时,不妨想想这个藏在转向柱里的 "小传感器"—— 正是它的精准感知,才有了每一次顺畅的转向体验。

weixin_59825476的博客 4288

Windows消息处理(系统消息) WM_QUIT、WM_DESTROY、WM_CLOSE、WM_SYSCOMMAND、WM_PAINT、WM_LBUTTONDO、WM_SIZE、WM_CREATE、

windows系统消息 WM_QUIT、WM_DESTROY、WM_CLOSE、WM_SYSCOMMAND、WM_PAINT、WM_LBUTTONDO、WM_SIZE、WM_CREATE、WM_LBUTTONDOWN

单于的学习历程 2779

Benchmark系列——UnixBench测试项深度解析与性能优化指南

本文深度解析UnixBench基准测试套件的各项测试原理,包括Dhrystone、Whetstone、系统调用、进程管理、IPC及文件I/O等核心测试项。通过详细的测试项分析,指导用户解读测试报告,并提供针对性的内核参数调整、编译优化及系统配置实战指南,帮助用户精准定位并优化系统性能瓶颈。

weixin_29230901的博客 276

QComboBox设置最大显示数量多余的用滑动条,以及QComboBox::setMaxVisibleItems()不起作用的问题

QComoboBox是Qt封装的一个选择框的东西,但是我在使用过程中有一点感觉很不好,如图: 不论你往里面添加多少个它都会给你显示全部,甚至给你铺满全屏,后来看了官方文档发现有个setMaxVisibleItems()的方法,我欣喜若狂啊,终于特么的能解决了,但是,很遗憾,不知为啥,我设置上之后并没有起作用,依然会显示全部,后来搜了百度发现有个人是这样解决的 QComboBox *box = ne...

Aboveground的博客 4919

WM_QUIT,WM_CLOSE,WM_DESTROY

     WM_DESTROY 是关闭程序     WM_CLOSE 是关闭窗口     WM_QUIT 是关闭消息环            WM_CLOSE和WM_DESTROY同属窗口消息,WM_QUIT则不在窗口消息之列。三者先后执行顺序是WM_CLOSE、WM_DESTROY、WM_QUIT,但需要注意的是MFC窗口默认取消按钮函数OnCancel()是不会触发WM_CLOSE消息

沙漠天空 4599

杭电计算机组成原理课程设计-实验七-寄存器堆设计实验

寄存器堆实验实验原理实验内容模块功能说明模块逻辑引脚图寄存器堆模块代码REG模块测试用例REG-ALU测试用例实验结果记录 寄存器堆实验结果及分析ALU_REG运算器模块实验结果及分析探索与思考 实验原理   32×32位的寄存器堆模块示意图如图所示,含有32个寄存器,每个寄存器32位。该寄存器堆具有A和B两个读端口,分别由 5 位的寄存器编号 R_Addr_A 和 R_Addr_B 来寻址 2 个寄存器,读出的数据则由 R_Data_A(32 位)和R_Data_B(32 位)输出。读访问时,没有使能或者

HDU-整蛊小子-⏰☂️/蚂蚁集团研发工程师 1万+

WM_CLOSE,WM_DESTROY,WM_QUIT

点击关闭按钮产生WM_CLOSE消息,在WM_CLOSE消息处理代码中调用DestroyWindow,DestroyWindow函数执行完毕产生WM_DESTROY消息,在WM_DESTROY消息中调用PostQuitMessage退出消息循环。WM_QUIT消息不与窗口关联,因此永远不会通过窗口的窗口过程接收。DestroyWindow完成窗口的清理工作,最后向窗口过程发送WM_DESTROY。在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮,窗口过程就会收到WM_CLOSE。

要把所有那些负面的信息当做对自身行为的评价,而不是对自身价值的评判。 657

SillyTavern 酒馆在 Mac 和 Linux 上的部署教程(含启动器安装方法)

SillyTavern 是一个支持多种大模型聊天接口的本地前端项目,适用于 MacOS 和 Linux 系统。本文提供了两种部署方式:手动安装和使用 SillyTavern Launcher 安装器。手动安装需要先安装 Git 和 NodeJS,然后克隆项目源码并运行启动脚本。使用 Launcher 则更为简便,适合新手用户,能够自动安装依赖和配置环境。部署完成后,用户可以通过浏览器访问本地服务器,加载角色卡片并连接大模型 API,享受二次元角色扮演聊天的乐趣。无论是开发者还是终端用户,都能轻松完成 Sil

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3394

高通蓝牙学习-- 关于Android 蓝牙的介绍

本文详细介绍了AOSP蓝牙架构及高通QCA芯片的蓝牙功能实现方案。主要内容包括:1)AOSP蓝牙架构在不同Android版本中的层次结构,重点分析BTHIDL层和libbt-vendor关键组件;2)QCA芯片的引导流程说明;3)两种获取libbt-vendor源码的方式(Google官方源和国内镜像源);4)针对QCA6595/6696/66x8/67x7芯片的具体实现方案,包括固件文件定义、厂商事件处理和补丁下载流程;5)蓝牙调试方法,包括logcat日志分析、HSU和Ellisys硬件跟踪技术。文章为

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 495

WM_QUIT WM_CLOSE WM_DESTROY消息的区别

WM_CLOSE:关闭应用程序窗口【关闭】 WM_DESTROY:关闭应用程序【销毁】 WM_QUIT:关闭消息循环【退出】 只有关闭了消息循环,应用程序的进程才真正退出(在任务管理器里消失)。 基本代码如下: while (::GetMessage(&msg, NULL, 0, 0)) { ::Translat

booksyhay的专栏 1260

华为OD机考双机位C卷 - 风险投资计划(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 风险投资计划(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 548

WM_CLOSE WM_QUIT WM_DESTROY 三者的区别

一直以来,我都不是很明白这三个的区别,今天看了一写文章,才明白过来,一下是转载的文字:有三个消息看起来差不多,都是处理关闭的事情的。它们是WM_DESTROY,WM_CLOSE,和WM_QUIT。它们的确很相似,但你需要知道它们之间的不同!一个窗口或者应用程序应该被关闭时发出WM_CLOSE消息,当接收到WM_CLOSE消息时,如果你愿意,向用户提出是否真的退出。你知道让用户作确认或

路径的专栏 9908

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WM_DESTROY ,WM_CLOSE ,WM_QUIT 的区别

WM_QUIT,WM_CLOSE,WM_DESTROY      WM_DESTROY 是关闭程序      WM_CLOSE 是关闭窗口      WM_QUIT 是关闭消息环      WM_CLOSE和WM_DESTROY同属窗口消息,WM_QUIT则不在窗口消息之列。三者先后执行顺序是WM_CLOSE、WM_DESTROY、WM_QUIT    但需要注意的是MF

u011045817的专栏 2019

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WM_CLOSE WM_DESTROY WM_QUIT 区别

在发送 WM_QUIT消息时,要使用PostMessage发送,否则,窗口已经关闭,但任务管理器中进程还存在。 可以通过 pDlg->PostMessage(WM_QUIT);或 DWORD dwThreadId = GetWindowThreadProcessId(pDlg->GetSafeHwnd(),NULL); PostThreadMessage(dwThreadId,WM_

刘华世的博客 562

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WM_CLOSE、WM_DESTROY、WM_QUIT区别

WM_CLOSE、WM_DESTROY、WM_QUIT区别 WM_CLOSE:关闭应用程序窗口 WM_DESTROY:关闭应用程序 WM_QUIT:关闭消息循环 只有关闭了消息循环,应用程序的进程才真正退出(在任务管理器里消失)。 点击窗口右上角的关闭按钮,或选择【File/Close】,发出 WM_CLOSE消息。CMyFrameWnd 并没有设置WM_CLOSE 处理常式,于是交给预设之处理常式即缺省窗口函数defwindoeproc。预设函数对于WM_CLOSE 的处理方式是呼叫 ::Des

baidu_16370559的博客 564

WM_CLOSE,WM_QUIT,WM_DESTROY的区别

WM_DESTROY, WM_CLOSE, WM_QUIT WM_DESTROY 是关闭程序的     WM_CLOSE   是关闭窗口的   WM_QUIT    是关闭消息环的 以下是程序结束的过程: 1、使用者按[File/Close],系统发出WM_CLOSE消息 2、Frame把这条消息直接发给预处理程序 3、预处理程序发出WM_DESTROY消息 4、预处理程序收到WM

bobopeng 643

WM_CLOSE WM_QUIT 和 WM_DESTROY EndDialog的区别

WM_CLOSE WM_QUIT 和 WM_DESTROY EndDialog的区别 1.WM_CLOSE其实就是我们按下右上方的那个"X"所执行的操作,这时窗口过程就会收到一个WM_CLOSE的消息,DefWindowProc是处理WM_CLOSE的默认函数,他调用DestroyWindow完成窗口的清理工作后发送WM_DESTROY。 2.一般WM_DESTROY做的是释放资源的工作,然后

hanyang291的专栏 831

WM_DESTROY, WM_CLOSE, WM_QUIT 区别

WM_DESTROY, WM_CLOSE, WM_QUIT 区别(转:只为收藏)开始我也很迷糊,后来看了相关的资料,现在明白了,我这里就转一些相关的文章吧.<br />WM_DESTROY, WM_CLOSE, WM_QUIT<br />WM_DESTROY 是关闭程序的    <br />WM_CLOSE   是关闭窗口的  <br />WM_QUIT    是关闭消息环的<br />以下是程序结束的过程:<br />1、使用者按[File/Close],系统发出WM_CLOSE消息<br />2、Fra

忍冬的专栏 1192

WM_DESTROY,WM_CLOSE,WM_QUIT的联系与区别

WM_DESTROY, WM_CLOSE, WM_QUIT 区别(转:只为收藏) 开始我也很迷糊,后来看了相关的资料,现在明白了,我这里就转一些相关的文章吧. WM_DESTROY, WM_CLOSE, WM_QUIT WM_DESTROY 是关闭程序的     WM_CLOSE   是关闭窗口的   WM_QUIT    是关闭消息环的 以下是程序结束的过程: 1、使用者按

ankangyanghushi的专栏 1096
上一篇: 关于TransparentBlt和AlphaBlend的不同
下一篇: 发现DeviceEmulatorBSP5.0的一个BUG
alien75
博客等级 码龄25年 195粉丝 116原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值