当前位置: 首页 > news >正文

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自定义消息就介绍完了

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

相关文章:

MFC开发,自定义消息

在MFC开发中,主要核心机制就是消息机制。QT与之类似的机制就是信号与槽。QT中的信号与槽是非常容易自定义的,MFC也是如此,自定义也是比较方便,况且自定义消息或者控件在整个GUI图形化界面开发中也是非常重要的部分,上篇…...

如何在 SpringBoot 中优雅的做参数校验?

一、故事背景 关于参数合法性验证的重要性就不多说了,即使前端对参数做了基本验证,后端依然也需要进行验证,以防不合规的数据直接进入服务器,如果不对其进行拦截,严重的甚至会造成系统直接崩溃! 本文结合…...

Godot入门 03世界构建1.0版

在game场景,删除StaticBody2D节点,添加TileMap节点 添加TileSet图块集 添加TileSet源 拖动图片到图块,自动创建图块 使用橡皮擦擦除。取消橡皮擦后按住Shift创建大型图块。 进入选择模式,TileMap选择绘制,选中图块后在…...

GitHub每日最火火火项目(7.26)

1. 项目名称:meta - llama / llama3 项目介绍:这是 Meta Llama 3 的官方 GitHub 站点。目前尚不清楚该项目的具体功能和特点,但从名称推测,它可能与 Llama 3 模型相关,或许涉及到该模型的开发、训练或应用等方面。 项…...

微服务实践和总结

H5原生组件web Component Web Component 是一种用于构建可复用用户界面组件的技术&#xff0c;开发者可以创建自定义的 HTML 标签&#xff0c;并将其封装为包含逻辑和样式的独立组件&#xff0c;从而在任何 Web 应用中重复使用。 <!DOCTYPE html> <html><head…...

Spring Boot中的策略模式:优雅地处理不同商品类型的订单

引言 在开发复杂的业务系统时&#xff0c;我们经常会遇到需要根据不同条件执行不同逻辑的情况。例如&#xff0c;在电商平台中&#xff0c;可能需要根据商品的不同类型&#xff08;如电子产品、服装、食品等&#xff09;来执行不同的业务逻辑&#xff0c;比如不同的库存管理、…...

django_创建菜单(实现整个项目的框架,调包)

文章目录 前言代码仓库地址在线演示网址启动网站的时候出现错误渲染路径的一些说明文件结构网页显示一条错误路由顺序js打包出现问题的代码函数没有起作用关于进度开发细节显示不了图片梳理一下函数调用的流程修改一些宽度参数classjs 里面的一些细节让三个按钮可以点击设置按钮…...

最新全新UI异次元荔枝V4.4自动发卡系统源码

简介&#xff1a; 最新全新UI异次元荔枝V4.4自动发卡系统源码 更新日志&#xff1a; 1增加主站货源系统 2支持分站自定义支付接口 3目前插件大部分免费 4UI页面全面更新 5分站可支持对接其他分站产品 6分站客服可自定义 7支持限定优惠 图片&#xff1a; 会员中心截图&…...

PyTorch安装CUDA标准流程(可解决大部分GPU无法使用问题)

最近一段时间在研究PyTorch中的GPU的使用方法&#xff0c;之前曾经安装过CUDA&#xff0c;不过在PyTorch中调用CUDA时无法使用。考虑到是版本不兼容问题&#xff0c;卸载后尝试了其他的版本&#xff0c;依旧没有能解决问题&#xff0c;指导查阅了很多资料后才找到了解决方案。 …...

C++从入门到起飞之——初始化列表类型转换static成员 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、初始化列表 2、 类型转换 3. static成员 4、完结散花 1、初始化列表 • 之前我们实现构造函数…...

PHP框架简介

PHP是一种广泛使用的开源脚本语言&#xff0c;主要用于Web开发&#xff0c;它可以创建动态交互式Web页面。而PHP框架则是一套用于开发Web应用程序的工具和库的集合&#xff0c;它可以帮助开发者更高效地编写PHP代码&#xff0c;提高开发速度和代码的可维护性。 理解PHP框架&am…...

微信小程序-粘性组件

再次完善&#xff1a;将区域设置为粘性时&#xff0c;会脱离原有文档&#xff0c;使得出现下方页面突然遮盖一部分&#xff0c;不平滑 解决&#xff1a;给出一个新的空白区域&#xff0c;宽高与粘性区域一致&#xff0c;wx:if 控制其显示 /****************/ 后续补充&#…...

微服务注册中心

目录 1.微服务的注册中心 1.1 注册中⼼的主要作⽤ 1.2 常⻅的注册中⼼ 2.nacos简介 2.1 nacos实战⼊⻔ 2.2.1 搭建nacos环境 2.2.2 将商品微服务注册到nacos 3.服务调⽤Ribbon⼊⻔ 3.1 Ribbon概述 3.1.1 什么是Ribbon 3.1.2 Ribbon的主要作⽤ 3.2.2 ⼯程改造 4.服务…...

HDU1032——The 3n + 1 problem,HDU1033——Edge,HDU1034——Candy Sharing Game

目录 HDU1032——The 3n 1 problem 题目描述 运行代码 代码思路 HDU1033——Edge 题目描述 运行代码 代码思路 HDU1034——Candy Sharing Game 题目描述 运行代码 代码思路 HDU1032——The 3n 1 problem 题目描述 Problem - 1032 运行代码 #include <iostr…...

内网对抗-隧道技术篇防火墙组策略HTTP反向SSH转发出网穿透CrossC2解决方案

知识点&#xff1a; 1、C2/C2上线-CrossC2插件-多系统平台支持 2、隧道技术篇-应用层-SSH协议-判断&封装&建立&穿透 3、隧道技术篇-应用层-HTTP协议-判断&封装&建立&穿透隧道技术主要解决网络通讯问题&#xff1a;遇到防火墙就用隧道技术&#xff0c;…...

实战案例:如何用ChatGPT生成适合不同领域的高质量文章

随着人工智能技术的快速进展&#xff0c;制作高质量文章已变得轻而易举。尤其是OpenAI推出的ChatGPT&#xff0c;极大地简化了写作任务。接下来&#xff0c;本文将通过具体案例&#xff0c;详解如何利用ChatGPT撰写不同领域的高品质文章。 背景&#xff1a;光辉AI交流-免费问答…...

多线程案例-单例模式

单例模式是设计模式之一&#xff0c;能保证某个类在程序中只存在唯一一份实例&#xff0c;而不会创建出多个实例 单例模式的具体实现方法有很多&#xff0c;最常见的是 “饿汉” 和 “懒汉” 两种。 饿汉模式 class Singlenton{private static Singlenton instance new Sin…...

P6 优化篇 - 数据折线图可视化步骤

增加新页面, 则需要在 page.json里面增加页面信息 2.添加目录, 和路径 同时也要添加目录了 , 新建目录LineChart , 添加文件LineChart.vue 4.LineChart.vue 直接复制黏贴 <template><view class"container"><!-- 图表显示区域 --><view cla…...

优选算法之二分查找(上)

目录 一、二分查找 1.题目链接&#xff1a;704. 二分查找 2.题目描述&#xff1a; 3.算法流程&#xff1a; 4.算法代码&#xff1a; 二、在排序数组中查找元素的第一个和最后一个位置 1.题目链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 2.题目描述…...

JavaScript(16)——定时器-间歇函数

开启定时器 setInterval(函数,间隔时间) 作用&#xff1a;每隔一段时间调用这个函数&#xff0c;时间单位是毫秒 例如&#xff1a;每一秒打印一个hello setInterval(function () { document.write(hello ) }, 1000) 注&#xff1a;如果是具名函数的话不能加小括号&#xf…...

IntelliJ IDEA实战:巧用Squash合并Git提交,打造清晰版本历史

1. 为什么需要合并Git提交&#xff1f; 刚入行那会儿&#xff0c;我特别喜欢频繁提交代码&#xff0c;每改几行就commit一次&#xff0c;美其名曰"版本控制"。结果一个月后回头看提交记录&#xff0c;满屏都是"修复bug"、"再修一下"、"最终…...

C++头文件和cpp文件的原理分析

通常&#xff0c;在一个C程序中&#xff0c;只包含两类文件——.cpp文件和.h文件。 .cpp文件被称作C源文件&#xff0c;里面放的都是C的源代码.h文件则被称作C头文件&#xff0c;里面放的也是C的源代码&#xff0c;头文件不用被编译 C语言支持“分别编译”&#xff08;separa…...

产品经理面试与求职攻略:Awesome Product Management 职业转型成功案例

产品经理面试与求职攻略&#xff1a;Awesome Product Management 职业转型成功案例 【免费下载链接】awesome-product-management &#x1f680; A curated list of awesome resources for product/program managers to learn and grow. 项目地址: https://gitcode.com/gh_mi…...

WindowsCleaner完整解析:如何用开源工具彻底解决Windows系统卡顿和C盘爆红问题

WindowsCleaner完整解析&#xff1a;如何用开源工具彻底解决Windows系统卡顿和C盘爆红问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否曾经在关键时刻被…...

LZ4与ZSTD压缩算法在LLM内存优化中的硬件实现对比

1. 项目概述&#xff1a;压缩算法在LLM内存优化中的关键作用 在大型语言模型&#xff08;LLM&#xff09;推理过程中&#xff0c;内存带宽和容量一直是制约性能的关键瓶颈。特别是随着模型规模的不断扩大&#xff0c;KV缓存&#xff08;Key-Value Cache&#xff09;所占用的内存…...

基于RT-Thread与STM32的物联网桌面天气时钟开发实战

1. 项目概述&#xff1a;一个嵌入式工程师的桌面小确幸几年前&#xff0c;我在工位上放了一个从网上淘来的电子时钟&#xff0c;功能很简单&#xff0c;就是显示时间。后来觉得光看时间有点单调&#xff0c;就想&#xff0c;能不能自己动手做一个既能显示时间日期&#xff0c;又…...

为防数据泄露!教你拆除2024款RAV4混动汽车调制解调器和GPS

拆除2024款RAV4混动汽车调制解调器和GPS&#xff0c;从源头上阻止数据传输&#xff01;现代汽车就像装在轮子上的电脑&#xff0c;配备众多传感器&#xff0c;会回传位置、速度等遥测数据。其车内和车外摄像头、麦克风及调制解调器默认开启&#xff0c;且难关闭&#xff0c;数据…...

上海国际航运研究中心:全球绿色航运发展报告(2024-2025)

本报告由上海国际航运研究中心与世界海事大学联合编制&#xff0c;聚焦 2024 年 1 月至 2025 年 9 月全球绿色航运发展&#xff0c;围绕政策、机制、清洁能源、减排技术、发展趋势五大核心展开&#xff0c;全面呈现航运业低碳转型的全球格局、关键进展与挑战。一、核心政策&…...

别再直接跳转了!用iframe在Vue项目里优雅嵌入第三方页面(附B站实战代码)

在Vue项目中优雅集成第三方页面的完整工程化方案 当我们需要在Vue应用中嵌入外部页面时&#xff0c;直接跳转会破坏应用的整体性和用户体验。本文将分享一套基于iframe的完整解决方案&#xff0c;涵盖从基础实现到高级优化的全流程实践。 1. 为什么选择iframe而非直接跳转 在现…...

思源宋体TTF终极指南:7种字重解决中文排版所有难题

思源宋体TTF终极指南&#xff1a;7种字重解决中文排版所有难题 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是否在为中文项目寻找完美的开源字体而烦恼&#xff1f;商业字体价格昂…...