MFC开发,自定义消息

news2024/11/15 16:02:15

在MFC开发中,主要核心机制就是消息机制。QT与之类似的机制就是信号与槽。QT中的信号与槽是非常容易自定义的,MFC也是如此,自定义也是比较方便,况且自定义消息或者控件在整个GUI图形化界面开发中也是非常重要的部分,上篇文章我们介绍了QT中自定义信号与槽,这篇文章就来带着大家来实现一下MFC的自定义消息

在实现之前,我们先来了解一下MFC中的消息机制

消息机制

消息机制既消息映射,就像映射表一样,消息映射是一个将消息和成员函数相互关联的表

这种映射要得益于MFC的底层封装,他屏蔽了代码的底层逻辑,用户只需要进行消息id与函数的绑定就能实现指定按钮的事件触发

消息机制由系统管理,可以将消息精准投放到对应窗口的消息队列中

自定义消息实现

自定义消息主要分为以下几个步骤

  • 自定义消息id

  • 自定义消息响应函数

  • 指定对话框注册消息

  • 实现消息响应函数

  • 触发自定义消息

详细步骤

  1. 自定义消息id

    自定义消息id一般用define进行宏定义,注意ID一定是大于WM_USER,因为WM_USER之前的已经被系统占用了,用了可能会出现未知的错误

  2. 自定义消息响应函数

    我们在注册消息时,一般使用ON_MESSAGE这个宏进行注册,所以消息的响应函数要符合ON_MESSAGE参数所规定的函数规范

  3. 指定对话框注册消息

    在MFC中每个对话框都对应这一个消息注册表,需要把消息id和响应函数结合起来用ON_MESSAGE(message, memberFxn)指示哪个函数将处理用户定义的消息(与映射表的功能相似),参数一消息ID、参数二为消息的响应函数

  4. 实现消息响应函数

    注册成功后,用户发送的对应消息就会传到我们的响应函数里面,具体业务实现就需要大家自己实现了

  5. 触发自定义消息

    自定义消息一般通过SendMessage或PostMessage函数进行消息触发

代码实现

自定义消息id

#define WM_TEST (WM_USER + 1)  // 自定义消息

自定义消息响应函数

自定义消息响应函数,这里我们来参考以下ON_MESSAGE宏里面的函数要求

可以看到ON_MESSAGE的函数要求是返回值类型为LRESULT,参数有两个类型分别为WPARAM和LPARAM

这里我们要说明以下,MFC的做法就没有QT的方便,QT是允许用户自定义信号与槽函数的参数的,所以这一点可以看出QT还是要比MFC方便的

// 自定义消息响应函数
afx_msg LRESULT OnTest(WPARAM wParam, LPARAM lParam);

指定对话框注册消息

下面就可以在对应对话框的消息注册表中,使用ON_MESSAGE宏进行自定义消息的注册了

BEGIN_MESSAGE_MAP(MainDlg, CDialog)
	ON_BN_CLICKED(IDOK, &MainDlg::OnBnClickedOk)
	ON_BN_CLICKED(IDCANCEL, &MainDlg::OnBnClickedCancel)
	ON_MESSAGE(WM_TEST, &MainDlg::OnTest)  // 自定义消息注册
END_MESSAGE_MAP()

实现消息响应函数

这里我们也没有主要业务场景,所以这里我们就打印一下日志,并输出一下这两个形参的值好了

LRESULT MainDlg::OnTest(WPARAM wParam, LPARAM lParam)
{
	TRACE(_T("自定义消息被触发 wParam:%s lParam:%d\r\n"), wParam, lParam);

	return 0;
}

触发自定义消息

我们就在点击确定按钮时利用SendMessage或PostMessage函数触发我们的自定义消息

void MainDlg::OnBnClickedOk()
{
	// 在此添加控件通知处理程序代码
	// CDialog::OnOK();
	::SendMessageA(GetSafeHwnd(), WM_TEST, (WPARAM)L"Mr.Lu", 666);
    CWinThread* thread = AfxGetThread();
	::PostMessageA(GetSafeHwnd(), WM_TEST, (WPARAM)L"Mr.Lu", 666);
}

测试

下面我们就来实际运行测试一下我们的代码

预期结果:自定义消息函数触发两次

如我们所料点击确定按钮,自定义消息函数被触发了两次

到这里,MFC自定义消息就介绍完了

感谢观看学习,大佬们多多指点,愿明天的自己会感谢当下的努力!!!!

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

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

相关文章

项目都做完了,领导要求国际化????--JAVA后端篇

springboot项目国际化相信各位小伙伴都会,很简单,但是怎么项目都做完了,领导却要求国际化文件就很头疼了 国际化的SpringBoot代码: 第一步:创建工具类 /*** 获取i18n资源文件** author bims*/ public class Message…

Java Collections类

Collections是一个与有关集合的工具类&#xff0c;提供了很多对集合进行操作的方法。 常见方法 addAll&#xff1a;往集合中添加多个元素。 public static <T> boolean addAll(Collection<? super T> c, T... elements) {boolean result false;for (T element…

MongoDB教程(二十):MongoDB正则表达式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、正则表…

Python3网络爬虫开发实战(3)网页数据的解析提取

文章目录 一、XPath1. 选取节点2. 查找某个特定的节点或者包含某个指定的值的节点3. XPath 运算符4. 节点轴5. 利用 lxml 使用 XPath 二、CSS三、Beautiful Soup1. 信息提取2. 嵌套选择3. 关联选择4. 方法选择器5. css 选择器 四、PyQuery1. 初始化2. css 选择器3. 信息提取4. …

程序的机器级表示(一)汇编,汇编格式和数据传输指令

系列文章 : 深入理解计算机系统笔记 文章目录 系列文章3 程序的机器级表示3.1 历史观点3.2 程序编码3.2.1 机器级代码3.2.2 代码示例3.2.3 关于格式的注解 3.3 数据格式3.4 访问信息3.4.1 操作数指示符3.4.2 数据传送指令3.4.3 数据传送示例3.4.4 压入和弹出栈数据 3 程序的机…

如何做校园圈子小程序,需要哪些功能?可打包APP小程序H5,源码交付,支持二开!

独立学校首页 支持每个学校独立首页!每个学校都可以拥有专属首页&#xff0c;打造不同风格的学校首页展示效果 多业务覆盖 可实现校园内外卖、跑腿、超市、药店水果、快餐店等业务全覆盖!所有配送业务平台都可开展 多站点运营 支持多学校多站点运营&#xff0c;各分站管理员可独…

【日记】办个护照不至于有这种刑事罪犯一样的待遇吧……(737 字)

正文 暴晒&#xff0c;中午出去骑共享单车&#xff0c;座垫都不敢坐。 至于为什么&#xff0c;中午觉都不睡跑出去&#xff0c;是因为今天他们办承兑汇票的业务&#xff0c;搞了一天&#xff0c;中午不休息&#xff0c;说可能还会用到我的指纹&#xff0c;让我 on call。我心想…

基础IO(文件系统)

一、块组的宏观理解 1、分区和分组 首先一台电脑就一个磁盘&#xff0c;一般800GB到1TB&#xff0c;为了管理这么大的内存数据&#xff0c;我们就对磁盘进行分区&#xff0c;分区之后才是我们看到的C盘&#xff0c;D盘等。 但是其实分区之后空间还是太大不好管理&#xff0c;…

习题2.23

不解释了&#xff0c;这么简单的题目。 (defn for-each[f item](if (not (empty? item));(println (f (first item)))(f (first item)))(if (not (empty? item))(for-each f (rest item)));(f (first item)))执行结果如下

FastGPT、Dify、Coze产品功能对比分析

在当前的人工智能领域&#xff0c;模型接入、应用发布、应用构建、知识库和工作流编排等功能是衡量一个AI平台综合能力的重要指标。本文将对FastGPT、Dify和Coze这三款产品的功能进行详细对比分析&#xff0c;以帮助用户更好地了解它。 订阅模式及市场概况 在订阅模式及市场概…

CSS常见属性详解——内边距与外边距

内边距与外边距 内边距 外边距 应用场景 在网页排版布局时&#xff0c;我们经常会希望元素与元素之间有一定的间距&#xff0c;此时我们可能会用到CSS的外边距或内边距属性&#xff0c;这两个属性都能让元素之间产生距离&#xff0c;那么他们之间有什么不同呢&#xff1f; …

【SpringBoot】1 Gitee

本项目 Gitee 地址&#xff1a;https://gitee.com/Lin_DH/system idea中可能装个gitee的插件&#xff0c;这样操作起来比较方便。 1&#xff09;登录 Gitee 官网&#xff08;https://gitee.com/&#xff09;&#xff0c;新建仓库。 2&#xff09;复制新建的 Gitee 仓库地址&am…

大麦抢票-狠货

大部分购买方式已迁移至手机端&#xff0c;专注研究移动端 小白操作–仅供学习 注意在帐号按权重的第三方账号设置解绑淘宝&#xff0c;否则有可能在抢票时候出现滑块&#xff0c;影响抢票,抢票优先选择大麦 ⚠️核心内容参考&#xff1a; 据悉&#xff0c;在购票环节&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的朋友排队(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

深入分析 Android ContentProvider (五)

文章目录 深入分析 Android ContentProvider (五)ContentProvider 的性能优化和实践案例1. 性能优化技巧1.1. 数据库索引优化示例&#xff1a;添加索引 1.2. 批量操作与事务管理示例&#xff1a;批量插入操作 1.3. 使用异步操作示例&#xff1a;使用 AsyncTask 进行异步查询 1.…

FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复&#xff0c;查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…

如何为 DigitalOcean 上的托管数据库收集可观测指标

DigitalOcean 在 2024 年 5 月开始支持在托管数据库&#xff08;PostgreSQL、MySQL、Redis和Kafka&#xff09;中收集可观测指标。我们将在本偏内容中&#xff0c;告诉大家如何使用部署在 DigitalOcean App Platform 上的网络应用程序&#xff0c;为 DigitalOcean 上的 Postgre…

C语言 | Leetcode C语言题解之第283题移动零

题目&#xff1a; 题解&#xff1a; void swap(int *a, int *b) {int t *a;*a *b, *b t; }void moveZeroes(int *nums, int numsSize) {int left 0, right 0;while (right < numsSize) {if (nums[right]) {swap(nums left, nums right);left;}right;} }

新手必备:iPhone新机官网验机流程详解

目录 一、准备工作 二、外包装检查 三、序列号查询 四、开箱验机 五、开机验机 六、功能检测 七、售后服务验证 八、总结 一、准备工作 检查包裹&#xff1a;确保快递包裹完好无损。准备录像设备&#xff1a;使用另一台设备录制整个验机过程&#xff0c;以防日后发生纠…

C# 贪吃蛇游戏

贪吃蛇游戏可分为手动玩法和自动玩法 冯腾飞/贪吃蛇