通俗的理解MFC消息机制

MFC消息机制+UI线程和工作线程+模式对话框原理 MFC消息机制,UI线程,工作线程,模式对话框原理,非模式对话框原理 阅读详情

1. 消息是什么?

想象你家的门铃响了(比如有人按门铃、敲门、或者有快递),这些都是“消息”。
在 MFC 中,消息就是系统或用户触发的各种事件,比如鼠标点击(WM_LBUTTONDOWN)、键盘输入(WM_KEYDOWN)、窗口关闭(WM_CLOSE)等。


2. MFC 的消息机制如何工作?

整个过程分三步走,类似“快递收发站”:

(1) 消息循环(快递分拣中心)
  • MFC 程序启动后,会运行一个“消息循环”(藏在 CWinApp 类里),像快递分拣中心一样,不断检查有没有新消息(比如鼠标点击、键盘输入)。
  • 当有消息时,分拣中心会把消息“打包”(封装成 MSG 结构),然后投递给对应的“收件窗口”。
(2) 窗口过程(快递员派送)
  • 每个窗口(比如按钮、对话框)都有一个“默认快递员”——窗口过程(WindowProc),负责接收消息。
  • 在 MFC 中,这个快递员已经被框架封装好了(比如 CWnd 类),它会根据消息类型,决定是“自己处理”还是“转交给其他快递员”。
(3) 消息映射(收件人处理包裹)
  • 关键点:MFC 用“消息映射表”(Message Map)把消息和对应的处理函数绑定。
  • 比如:当收到“鼠标左键点击”消息(WM_LBUTTONDOWN),MFC 会查表找到你写的 OnLButtonDown 函数来处理。
  • 代码示例:
    BEGIN_MESSAGE_MAP(MyWindow, CWnd)
      ON_WM_LBUTTONDOWN()  // 绑定消息和函数
    END_MESSAGE_MAP()
    
    void MyWindow::OnLButtonDown(UINT flags, CPoint point) {
      // 处理鼠标点击的逻辑,比如弹个对话框
      MessageBox(_T("你点击了鼠标!"));
    }
    

3. 为什么要用消息机制?

  • 解耦:就像快递系统把“发件人”和“收件人”分开,消息机制让“事件触发”和“事件处理”解耦。
  • 灵活性:你可以自由决定哪些消息需要处理(比如只关心按钮点击,不关心键盘输入)。
  • 效率:系统不会因为某个窗口“忙”而卡死,消息会被排队处理。

4. 实际场景举例

假设你做了一个按钮,点击后关闭窗口:

  1. 用户点击按钮 → 触发 WM_LBUTTONDOWN 消息。
  2. MFC 的消息循环将消息分发给按钮对应的窗口。
  3. 按钮的窗口过程通过消息映射找到你写的 OnClick 函数。
  4. 你在 OnClick 中调用 DestroyWindow() 关闭窗口。

5. 总结:MFC 消息机制的核心

  • 消息循环:不断“收快递”。
  • 窗口过程:默认的“快递分拣员”。
  • 消息映射:告诉系统“哪个快递(消息)由谁签收(处理函数)”。

就像生活中的快递系统,MFC 的消息机制让程序能高效、有序地响应各种事件!🚚

深入理解win32消息机制 想要学习win32程序设计,消息机制必须深刻的理解的。这是所有win32程序的基石。 下面只是我学习和复习过程中的笔记加上自己的总结,谈不上原创。只为方便他人学习,也为方便自己复习。 一图胜千言,下面是截取侯捷的《深入浅出MFC》一书的一张图,画的很是通俗易懂,所以就直接粘了过来。 关于这幅图的解释: 首先是鼠标,键盘这些输入设备通过各自的驱动程序把消息传送给操作系统, 阅读详情

相关推荐

MFC多进程多线程编程之--多线程

进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。 线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也

无兴趣,不编程 3669

MFC消息机制

MFC消息机制

weixin_47328424的博客 1226

C++编程入门到实战:书籍与MFC开发全面指南

函数并非仅仅是语法糖或逻辑分组工具,其背后涉及操作系统、CPU架构与编译器协同工作的复杂机制。每次函数调用都会触发一系列底层操作,包括栈空间分配、寄存器保存、控制流跳转等。要真正掌控函数的行为,必须深入到机器级执行模型中去观察其生命周期。类模板的语法结构如下:private:T data[N];public:该模板定义了一个固定大小的数组容器,其中T为元素类型,N为数组长度。注意size()使用了constexpr,使其可在编译期求值。安全级别定义。

weixin_42465140的博客 1121

windows消息机制(MFC)

windows消息机制(MFC) 消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据的含义也不一样。 time表示产生消息的时间,pt表示产生消息时鼠标的位置。 按照类型,Windows将消息分为: (0) 消息ID范围 系统定...

u011555996的博客 1165

MFC线程自定义消息循环

MFC线程自定义消息循环

MFC框架原理以及消息运行机制

很好很强大,将MFC框架原理以及消息运行机制讲解的十分透彻,让你有一种顿悟的感觉,千万别犹豫!!!

MFC——基本概念的通俗理解1

1 文档视结构     完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd窗口框架类,CDocument文档类,CView视类     过程:     CWinApp创建CFrameWnd框架窗口实例,框架窗口创建文档模板,文档模板创建文档实例和视实例,将两者关联     2  消息映射        一个消息=消息名称(UINT)+参数(WPARAM,LPARAM

doudouqbj的博客 1608

在Visual Studio中搭建Dynamo Python开发环境,效率飞一般的增长

在Visual Studio中搭建Dynamo Python开发环境,效率飞一般的增长

BIM的乐趣 1730

MFC 消息机制原理探索 ——从何而来,欲去何方

MFC的消息机制(也是Windows的消息机制): 1.【说明】这里不细细的分析,这些知识点是大量的资料及书上撷取下来的。 2. 【MFC消息机制的起止】 => UI产生消息 (比鼠标点一下UI即窗口,在Windows上一可执行文件一般通俗看成一个窗口,说法不严谨) 。 => 相应的驱动程序先得到信号(如果你鼠标点击,鼠标的驱动程序先得到信号,如果你键盘,则亦...

Soar_dream的博客 350

单晶塑性abaqus-umat自学

单晶塑性abaqus-umat 摘要1. 简介2. 单晶弹塑性本构模型回顾2.1运动学 本文以翻译黄永刚老师的umat文章为主,这个颜色的为个人的理解。 摘要 包含单晶塑性的abaqus用户材料子程序。本文回顾有限元形式的单晶弹塑性和黏弹塑性,包含小变形理论,以及严格的有限变形和有限旋转理论。单晶的非弹性变形由于晶体滑移,假定遵从Schmid准则。提出多种多样的分切应力与剪切变形的自硬化和潜硬化关系,并且包含在子程序内。 1. 简介   有限元程序ABAQUS已经广泛应用在固体的变形与应力分析。除了自身大量

Niklas4088的博客 1万+

Nginx/OpenResty目录穿越漏洞复现

Nginx/OpenResty目录穿越漏洞复现 漏洞背景: 2020年03月18日, 360CERT监测发现 openwall oss-security 邮件组披露了两枚漏洞。在特定配置下 nginx/openresty 存在 内存泄漏漏洞/目录穿越漏洞。 Nginx 是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。 OpenResty是一个基于nginx的Web平台,它对nginx增加LuaJIT引擎使其运行Lua脚本。 影响版本: nginx <= v1.17

小小猪的博客 1万+

微软MFC技术中消息的定义

微软MFC技术中消息的定义

荔园微风的博客 922

用Coze平台30分钟打造《花光10亿》小游戏:零代码AI开发实战

本文详细介绍了如何利用字节跳动推出的Coze平台,在30分钟内零代码开发一款名为《花光10亿》的AI小游戏。通过配置提示词、集成图像生成插件、构建自动化工作流以及使用数据库功能,即使没有编程基础的用户也能快速将创意转化为可交互的智能应用,体验AI开发的便捷与高效。

weixin_29313547的博客 208

MFC基本概念与知识

MFC基本概念与知识 1 MFC定义 1.1 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。 1.2 ...

树下一朵云的博客 1554

基于deepseek+dify+达梦实现自然语言查询数据库

自然语言查询数据库信息

weixin_43974943的博客 1594

Tribon Vitesse开发教程(一)

Tribon Vitesse简介 Tribon Vitesse是Tribon提供给Python编程语言的编程接口,它是一系列的API。使用Python的语法调用这些API,结合Python语言自身的语法生成的程序叫做Vitesse程序。Vitesse是法语“速度”的意思,读作“为戴斯”。使用Tribon Vitesse可以直接访问Tribon产品信息模型和使用Tribon应用程序的功能,以控制设计

forevermemory的专栏 2593

GTK 与MFC不完全对比

GTK 与MFC不完全对比

jggyff的博客 283

时频分析之STFT:短时傅里叶变换的原理与代码实现(非调用Matlab API)

STFT function [STFT, f, t] = mystft(x, win, hop, nfft, fs) % function: [STFT, f, t] = stft(x, win, hop, nfft, fs) % % Input: % x - signal in the time domain % win - analysis window function % hop - hop size % nfft - numb

frostime的博客 13万+

VC++消息映射的思考

 VC++消息映射的思考作者:郝庆欣在学习VC++的时候,大家都不可避免的用到消息映射。我们都知道C++是一种面向对象的编程语言,VC++中为什么这样来实现消息映射呢?  首先要明白一个包含了消息处理的Windows程序是如何工作的。  一般来说一个包含了消息处理的Windows程序至少要包含两个函数   第一个:    int WINAPI WinMain(      HINSTAN

handj的专栏 1096

2026年软考高级网络规划设计师第三版备考笔记

删除了所有已退出主流应用、行业淘汰的技术内容,如 HDLC、xDSL、WiMAX、HSRP/GLBP 等,让教材内容更聚焦当下一线网络工程实际场景,剔除无效考点。

鹿鸣天涯 1216

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

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

消息问题

虽然这是一个很简单的操作,但却耗费了我不少的时间,主要是我对消息机制没有充分的理解吧,最后终于在codeproject中找到了类似的例子,自己也顿开毛塞,写这篇文章的目的是对前面做的工作的一个总结,也想将自己的一些经验和大家分享,避免重走弯路。要实现标题中所说的功能,首先要了解Windows的消息机制,看了一篇专门讲述消息机制的文章,觉得很好,就将其中重要部分摘出来作为本文的铺垫(这篇文章来自雷神

gooer的专栏 915

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Win32基于事件驱动的消息机制

消息机制和绘图机制是微软Windows及其周边其它产品与生俱来的,是Win 系列OS作为一个操作系统进行微机内部实现的二大支柱和特征,消息系统是Windows下一切应用程序间,包括Windows自身,进行交互和通讯的渠道,是Windows实现对运行在其下的所有应用程序进行控制及应用程序对Windows进行响应的解决手段,因此对Windows的编程,无论是在哪种 语言规范和IDE 下,都不可避免地要

dongyue786的专栏 804

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深入理解MFC子类化

子类化,通俗来讲就是用自己的窗口处理函数来处理特定消息,并将自己其他消息还给标准(默认)窗口处理函数。在SDK中,通过SetWindowLong来指定一个自定义窗口处理函数:SetWindowLong(hwnd, GWL_WNDPROC, (LONG)UserWndProc);。可是到了MFC中,大部分基础的东西都被封装起来了,那么,这是该怎么实现子类化呢?       先来看一个例子:     ...

weixin_34224941的博客 117

MFC学习之windows内部运行机制

windows的程序离不开窗口,chuan

hnust_疯子 1194

mfc 消息消息队列概念_这些MQ概念你都懂吗:死信队列、重试队列、消息回溯等...

消息队列(MQ)的基本概念,很多时候都要了解清楚,这样在学消息队列中间件就比较能够游刃有余,遇到不清楚的也可以重新翻来看看,加深理解。这里有关于:优先级队列、延迟队列、死信队列、重试队列、消息回溯、消息堆积、消息追踪/消息轨迹、消息过滤、消息审计、消息路由等的介绍。01优先级队列优先级队列不同于先进先出队列,优先级高的消息具备优先被消费的特权,这样可以为下游提供不同消息级别的保证。不过这...

weixin_39580682的博客 296

【 MFC框架结构深度剖析:零代码弹窗的幕后英雄】

摘要:本文介绍了MFC框架的基本结构,通过一个对话框应用示例解析了MFC的四大核心部分。资源文件Resource.h管理界面元素ID,预编译文件解决头文件冲突。应用程序类CTestOneApp作为程序入口,初始化并显示主对话框;对话框类CTestOneDlg处理用户交互,通过消息机制响应按钮点击等操作。文章以添加按钮响应为例,展示了MFC的消息处理流程,强调理解框架可提升开发效率。MFC通过封装底层细节,让开发者能专注于业务逻辑实现。

深耕CV 935
上一篇: 通俗的桥接模式
下一篇: C++ RAII机制
越甲八千
博客等级 码龄11年 2959粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值