MFC开发,自定义消息

在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://xiahunao.cn/news/3268176.html

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

相关文章

【python】python销售数据分析可视化(源码+论文+数据集)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

记忆、思维、问题解决与创造、想象

记忆 思维 问题解决与创造性 想象

食家巷一窝丝:丝丝入味,口口留香

在美食的大观园中,有一种独特的美味让人难以忘怀,那就是食家巷一窝丝。食家巷一窝丝,以其精湛的制作工艺和独特的口感,成为了众多美食爱好者的心头好。 当你第一眼看到一窝丝,定会被它那精致的外形所吸引。纤细如丝的面…

nodejs - express 学习笔记

express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,官方网址:https://www.expressjs. com.cn/ 简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务&am…

如何恢复最近删除的文件?5种简单方法!

数据丢失在我们的工作生活中经常发生。当你决定清理硬盘或U盘时,你会删除一些文件夹或文件。如果你通过右键单击删除文件,则可以很容易从回收站恢复已删除的文件。但是,如果你按Shift Delete键、清空回收站或删除大于8998MB的大文件夹&#…

哪些ESP32系列芯片具有双道通I2S和PDM RX?

ESP32芯片选择: 需要使用2个通道IIS的,只能选择ESP32、ESP32-S3、ESP32-P4三种之一,需要适应PDM RX时也只能选择这3个芯片系列。 芯片I2S 标准PDM TXPDM RXTDMADC/DACLCD/摄像头ESP32I2S 0/1I2S 0I2S 0无I2S 0I2S 0ESP32-S2I2S 0无无无无I2…

[C++实战]日期类的实现

💖💖💖欢迎来到我的博客,我是anmory💖💖💖 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

MySQL中不等于筛选时会漏掉null值的问题

一、问题描述 MySQL中使用不等于进行筛选数据时&#xff0c;若筛选值为null&#xff0c;则该条数据不会被选中&#xff0c;如何解决该问题&#xff1f; 表示不等于的方式如下&#xff1a; ! <> not in二、案例验证 1、创建数据表 -- ---------------------------- -…

20240725java的Controller、DAO、DO、Mapper、Service层、反射、AOP注解等内容的学习

在Java开发中&#xff0c;‌controller、‌dao、‌do、‌mapper等概念通常与MVC&#xff08;‌Model-View-Controller&#xff09;‌架构和分层设计相关。‌这些概念各自承担着不同的职责&#xff0c;‌共同协作以构建和运行一个应用程序。‌以下是这些概念的解释&#xff1a;‌…

Nestjs使用Redis的最佳实践

前几天在项目中有用到Redis JWT实现服务端对token的主动删除(退出登录功能)。故此介绍下如何在Nestjs中使用Redis&#xff0c;并做下总结。 知识准备 了解Redis - 网上很多简介。了解Nestjs如何使用jwt生成token - 可移步看下我之前的文章 效果展示 一、mac安装与使用 示…

Typora笔记上传到CSDN

1.Typora 安装 Typora链接&#xff1a;百度网盘 提取码&#xff1a;b6d1 旧版本是不需要破解的 后来的版本比如1.5.9把放在typora的根目录下就可以了 2.上传到CSDN 步骤 csdn 写文章-使用MD编辑器-导入本地md文件即可 问题 图片没法显示 原因 图片的链接是本地的 当然没法…

pyqt designer使用spliter

1、在designer界面需要使用spliter需要父界面不使用布局&#xff0c;减需要分割两个模块选中&#xff0c;再点击spliter分割 2、在分割后&#xff0c;再对父界面进行布局设置 3、对于两边需要不等比列放置的&#xff0c;需要套一层 group box在最外层进行分割

模板编程中二义性问题

前言 菱形继承是 一个常见的二义性问题&#xff0c;这个问题在模板元编程中也很容易隐晦的存在 错误示例代码 #include <iostream>template <int N> struct A {int getN() { return N; } };template <int N> struct B : A<N % 2>, B<N / 2> {…

创建文件到底发生了什么?

为什么要浅浅探究这个问题&#xff1f; 大家大部分时间的工作其实都是写业务层的”CURD“&#xff0c;而真正陪伴在我们身边的计算机底层原理则不再有那么多好奇心去探究了。这篇文章旨在抛砖引玉&#xff0c;也许大家在空闲的时间里&#xff0c;也能够去探求自己以前一直想知…

AcWing最长连续不重复子序列

哈希表就完事儿了&#xff0c;key是a[j],value是a[j]出现次数 i丢到前面&#xff0c;j丢到后面&#xff0c;然后j往后面遍历&#xff0c;每次记录a[j]出现次数 m a p [ a [ j ] ] map[a[j]] map[a[j]]&#xff0c;如果a[j]出现次数2次及其以上 m a p [ a [ j ] ] > 1 map[a[…

信号量的实例

例题&#xff1a; 进程 a 和进程 b 模拟访问打印机&#xff0c;进程 a 输出第一个字符‘ a’表示开始使用打印 机&#xff0c;输出第二个字符‘ a’表示结束使用&#xff0c; b 进程操作与 a 进程相同。&#xff08;由于打印机同一时刻 只能被一个进程使用&#xff0c;所以输出…

【数据结构--排序】

目录 一、排序概述1.1、排序的相关定义1.2、排序用到的结构与函数 二、常见排序算法2.1、冒泡算法&#xff08;交换顺序&#xff09;&#xff08;1&#xff09;算法&#xff08;2&#xff09;性能分析 2.2、简单选择排序&#xff08;1&#xff09;算法&#xff08;2&#xff09…

yolov5-7环境搭建训练自己的模型

1.下载代码 git clone https://github.com/ultralytics/yolov5 # clone可以切到5-7版本&#xff0c;也可以去github选标签下载 2.配置好conda环境&#xff0c;网上教程比较多&#xff0c;不做讲解&#xff0c;python3.8即可。 3.在环境里安装pyrtorch 按自己的需求选取&am…

C#初级——条件判断语句、循环语句和运算符

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…

『 Linux 』信号的捕捉及部分子问题

文章目录 信号的捕捉sigaction函数未决信号集的置零时机信号处理过程的阻塞可重入函数volatile 关键字SIGCHLD 信号 信号的捕捉 该图为基于信号处理为用户自定义动作的图解; 信号的捕捉 当一个信号被递达时,如果该信号的处理动作是用户自定义的函数(如int sighandler(int))时就…