微软MFC技术中消息的定义

news2024/9/23 21:32:29

 我是荔园微风,作为一名在IT界整整25年的老兵,今天来聊聊MFC技术中消息的定义。

本贴子首先介绍MFC消息的基本概念,理解消息的定义是学习使用MFC的基础。了解消息的驱动机制后,才能彻底明白MFC的运行机制。

首先来看什么是消息。通俗地讲,人们常常把外界的各种报道称为消息。消息反映知识状态的改变。而对于计算机语言来说,消息是对象之间进行交互作用和通信的。单一的对象通常没有多大用处。相反,一个对象通常需要跟许多其他对象相互交互才能完成一系列的事件并实现自身价值。

当一辆汽车不被使用时,它就是一堆金属和橡胶,它没有任何的活动。而只有当其他的对象与其交互时,它才可以有所动作。一个MFC程序如果要实现某种功能,就必须要有其他对象与其进行交互或通信。当一个对象希望一个MFC程序执行此对象的方法,此对象就会发送消息给这个MFC程序。在MFC程序设计中,消息是指一个类实例和另一个类实例之间传递的信息。

有时,接收的对象需要更多的信息,这样它才可以正确知道该如何做。比如,当司机想改变汽车的转向,司机就必须为汽车指向应转向哪个方向。此信息是将消息作为参数来传递的。它是由司机传给汽车。

另外,消息提供了两个重要的好处:对象的行为是通过它的方法来表达的,因此消息传递支持所有对象之间的可能的交互,对象不需要在相同的进程或者相同机器上来发送和接收消息给其他的对象。

消息的定义

消息系统对于MFC程序来说十分重要,它相当于一辆汽车的发动机。一个消息,是系统定义的一个32位的值,它唯一地定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。例如,双击鼠标、改变窗口位置、按下键盘上的一个键都会使Windows发送一个消息给应用程序。

消息本身是作为一系列值传递给应用程序的,其中包括消息的类型以及其他信息。例如,对于按下键盘上的一个键所产生的消息来说,这一系列值中包括了按下键的值。此一系列值的类型叫做MSG,MSG含有 Windows应用程序消息队列的消息信息,它在 Windows中声明如下:

typedef struct tagMsg
{
  HWND hwnd;    //接受该消息的窗口句柄
  UINT message;  //消息常量标识符,也就是通常所说的消息号
  WPARAM wParam;  //32位消息的特定附加信息,确切含义依赖于消息值
  LPARAM lParam;  //32位消息的特定附加信息,确切含义依赖于消息值
  DWORD time;    //消息创建时的时间
  POINT pt;     //消息创建时的光标在屏幕坐标系中的位置
}MSG;

消息可以由系统或者应用程序产生。系统在发生输入事件时产生消息。例如,当用户单击鼠标、敲击键盘或者单击控件,系统也产生消息以响应由应用程序带来的变化。又比如应用程序可以产生消息使窗体执行任务、改变窗口风格、更换贴图等。


针对上面给出的消息MSG,接下来再进一步地解释此结构体中的各个变量。

(1)hwnd表示消息所属的窗口。MFC程序都是窗口应用程序,一个消息一般都是与某个窗口相关联的。例如, 在某个活动窗口中单击鼠标右键, 产生的按键消息就是发给该窗口的。在MFC程序中,用 HWND类型的变量来标识窗口。

(2)message指定了消息的标识符。在Windows中, 消息是由一个数值来表示的,不同的消息对应不同的数值。 但是由于数值不便于记忆,所以 Windows将消息对应的数值定义为WM_XXX宏(WM是Window Message的缩写)的形式,XXX对应某种消息的英文拼写的大写形式。例如,单击鼠标右键消息是 WM_RBUTTON_DOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM CHAR等。在程序中,通常是以WM_XXX宏的形式来使用消息的。

(3)wParam和IParam用于指定消息的附加信息。例如, 当收到一个字符消息时,message成员变量的值就是WM_CHAR, 但用户到底输入的是什么字符,那么就由wParam和lParam来说明。wParam、 lParam表示的信息随 message的值不同而不同。另外在MSDN 中可以发现这两种类型实际上就是unsigned int和 long。

(4) time表示消息投递到消息队列中的时间。

(5)pt表示消息投递到消息队列中光标的当前位置。

注意:如果想知道WM_XXX消息对应的具体数值, 可以在MFC工程中右击WM_XXX,在弹出的菜单中选择Go To Definition, 即可看到该宏的具体定义。跟踪或查看某个变量的定义,都可以使用这个方法。或者是直接在MSDN 中查找。
 

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS code搭建JavaScript环境调用XHR实现post和get简单流程

一、下载NodeJS 下载node,最好到node官 https://nodejs.org/en/ 下载一个LTS(Long Term Surport)长期支持版本。 输入命令node -v 就可以看到node的版本了如果node安装包集成了npm(node package manage),那我们输入命令npm -v 也…

11 S整数小波分解图像(matlab程序)

1.简述 学习目标: 非标准小波分解(用S整数变换) 小波分解过程:读取加入噪声后的图片后,数据即是高度*宽度个数据点。对此矩阵数据要做二维离散小波分解,二维小波变换和一维小波变换的区别从原理上来说就是…

stable diffusion webui 下载和使用civitai中的模型

1.网址 C站网址为:https://civitai.com/。注:这里需要科学上网 2.下载模型 1.选择想要的模型,点击【Download】按钮,这里演示【Deliberate】模型的下载和使用 2.将下载的模型,存放到【/models/Stable-diffusion】目…

基于圆弧搜索和最小似然圆估计的圆查找算法

在这里提出一种算法,其实是将两篇papers的想法的结合。没有什么创新点,只是做一下算法原理的记录,防止后面重新看代码的时候一头雾水。 算法的目的在于查找特定半径范围的圆,而不致力于查找所有的圆,当然它也支持查找所…

04约瑟夫环

约瑟夫问题 设编号为1&#xff0c;2&#xff0c;3……n的n个人围坐成一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人出列&#xff0c;它的下一位又从1开始报数&#xff0c;数到m的那个人又出列&#xff0c;以此类推&#xff0c;直到所有人…

新手简单看懂Servlet里面的web.xml配置

背景&#xff1a; ecplisetomcatservlet 我们在学习servlet时候&#xff0c;因为前面基础没学好&#xff0c;导致servlet看不懂&#xff0c;比如笔者当时就是servlet的web.xml看不懂&#xff0c;如果我们能先看懂web.xml&#xff0c;知道前端访问哪个接口&#xff0c;调用哪个…

一个VBA的概率的模型(草稿)(未完成)

现在 可以让概率变化一般的抽奖&#xff0c;都是 概率稳定的&#xff0c;好处是稳定&#xff0c;没啥好处坏处是&#xff0c;不同的人次数差距很大&#xff0c;无法形成稳定的预期 概率0.1 变成概率0.1&#xff0c;如果失败就增加概率 这个增加概率可以是&#xff0c;已经失…

Flutter学习四:Flutter开发基础(五)资源管理

目录 0 引言 1 资源管理 1.1 指定 assets 1.2 Asset 变体&#xff08;variant&#xff09; 1.3 加载 assets 1.3.1 加载文本 1.3.2 加载图片 1.3.2.1 声明分辨率相关的图片 1.3.2.2 加载图片 1.3.3 依赖包中的资源图片 1.3.4 打包包中的 assets 1.3.5 特定平台 as…

B062-组件 路由 属性扩展 webpack Vue-cli

目录 一&#xff1a;组件1.何为组件2.组件的定义方式全局组件局部组件 3.组件的注意事项4.template的定义方式5.组件获取数据的方式 二&#xff1a;路由1.什么是路由&#xff1f;2.路由的使用步骤 三&#xff1a;Vue属性扩展1.计算属性 computed和监听属性 watch3.钩子函数 mou…

【Redis 三种模式----主从复制、哨兵以及集群】

目录 一、主从复制1.1、主从复制的概念1.2、主从复制的作用1.3、主从复制流程1.4、搭建Redis 主从复制1、环境准备2、安装Redis3、修改 Redis 配置文件&#xff08;Master节点操作&#xff09;4、修改 Redis 配置文件&#xff08;Slave节点操作&#xff09;5、验证主从效果 二、…

[牛客周赛复盘] 牛客周赛 Round 1 20230702

[牛客周赛复盘] 牛客周赛 Round 1 20230702 总结游游画U1. 题目描述2. 思路分析3. 代码实现 游游的数组染色1. 题目描述2. 思路分析3. 代码实现 游游的交换字符1. 题目描述2. 思路分析3. 代码实现 游游的9的倍数1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 牛客第一…

时序预测 | MATLAB实现BO-NARX和BO-LSTM贝叶斯优化神经网络股票价格预测比较

时序预测 | MATLAB实现BO-NARX贝叶斯优化非线性自回归外生模型和BO-LSTM贝叶斯优化长短期记忆神经网络股票价格预测比较 目录 时序预测 | MATLAB实现BO-NARX贝叶斯优化非线性自回归外生模型和BO-LSTM贝叶斯优化长短期记忆神经网络股票价格预测比较效果一览基本介绍研究过程程序…

《分布式中间件技术实战:Java版》学习笔记(二):RabbitMQ死信队列/延迟队列实现商品扣库存

一.关于RabbitMQ 1.RabbitMQ交换机类型 (1).FanoutExchange&#xff1a;广播交换机。消息发送到交换机后&#xff0c;会广播到所有队列&#xff0c;不需要经过路由。 (2).DirectExchange&#xff1a;直通交换机。生产者发送消息到交换机(Exchange)&#xff0c;再经过路由(Ro…

自然语言处理从入门到应用——预训练模型总览:预训练模型的拓展

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 相关文章&#xff1a; 预训练模型总览&#xff1a;从宏观视角了解预训练模型 预训练模型总览&#xff1a;词嵌入的两大范式 预训练模型总览&#xff1a;两大任务类型 预训练模型总览&#xff1a;预训练模型的拓展 …

Fully-Convolutional Siamese Networks for Object Tracking(SiamFC)

Fully-Convolutional Siamese Networks for Object Tracking&#xff08;SiamFC&#xff0c;ECCV2016&#xff09; 全卷积网络的优势在于&#xff0c;可以将一个更大的搜索图像作为输入提供给网络&#xff0c;它将在单个评估中计算所有平移后的子窗口的相似度&#xff0c;而不…

安全中级11:sql注入+联合、报错、时间盲注+sqlmap使用

目录 一、sql注入原理 二、联合SQL注入的方法 1.总体的思路 &#xff08;1&#xff09;先进行闭合&#xff0c;进行报错 &#xff08;2&#xff09;进行逃逸 &#xff08;3&#xff09;外带数据 &#xff08;4&#xff09;获取库名 表名 列名 数据 &#xff08;5&#…

【PADS封装】Dsub(DB9,DB15d等)公母头座子封装(带3D)

包含了我们平时常用的贴片Dsub(DB9,DB15等)公母头座子封装&#xff0c;总共28种封装及精美3D模型。完全能满足日常设计使用。每个封装都搭配了精美的3D模型哦。 1.D-Sub是被用来连接数据生成设备和数据输出设备&#xff0c;D-Sub和VGA&#xff0c;两者叫法不同。VGA是IBM在1987…

node-sass 安装失败解决办法

前言 很多小伙伴在安装 node-sass 的时候都失败了&#xff0c;主要的原因是 node 版本和项目依赖的 node-sass 版本不匹配。 解决方案 解决方案&#xff1a;把项目中的 node-sass 替换为 sass&#xff0c;其实 node-sass 已被官方弃用。 官方公告&#xff1a; LibSass and …

Echarts X轴label标签文本和刻度线对齐显示,而不是呈现在两个刻度线之间

如下图所示X轴标签文本Mon位于两个刻度线中间&#xff1a; 想要的效果是如下图&#xff0c;刻度线正下方是标签文本Mon&#xff1a; 只需要在xAxis中添加axisTick的alignWithLabel属性&#xff0c;属性值设为true即可&#xff1a; option {xAxis: {type: category,axisTick: …

Nginx【Nginx虚拟主机单网卡多IP配置、Nginx虚拟主机基于域名的配置 】(四)-全面详解(学习总结---从入门到深化)

Nginx虚拟主机单网卡多IP配置 通过不同的IP区分不同的虚拟主机&#xff0c;此类虚拟主机对应的企业应用非常少见&#xff0c;一般不同业务需要使用多IP的常见都会在负载均衡器上进行VIP绑定&#xff0c;而不是在Web上通过绑定IP区分不同的虚拟机。 需求 一台Linux服务器绑定两…