【上位机——MFC】消息映射机制

消息映射机制

  • Window消息分类
  • 消息映射机制的使用
    • 代码示例

MFC框架利用消息映射机制把消息、命令与它们的处理函数映射起来。具体实现方法是在每个能接收和处理消息的类中,定义一个消息和消息函数指针对照表,即消息映射表。

在不重写WindowProc虚函数的大前提下,仍然可以处理消息。

Window消息分类

  1. 标准Windows消息:除WM_COMMAND外以WM_开头的消息都是标准消息。
  2. 命令消息:消息名为WM_COMMAND,消息中附带了标识符ID来区分来自哪个菜单、工具栏按钮或加速键的消息。
  3. 通知消息:通知消息一般由列表框等子窗口发送给父窗口,消息名也是WM_COMMAND,其中附带了控件通知码来区分控件。
  4. 用户自定义消息:用户定义一个宏作为消息,值大于WM_USER。

CWnd的派生类可以接收者四种消息,命令消息还可以由文档类接收。
命令消息的处理顺序:框架类(CFrameWnd派生类)优先于应用程序类(CWinApp派生类)。视图类(CView派生类)优先于框架类(CFrameWnd派生类)。

消息映射可以通过VS2022的菜单项自动生成
项目-》类向导 选择你需要再哪个类中添加对应的消息。
如下图:
在这里插入图片描述

消息映射机制的使用

  1. 类内必须添加声明宏
    DECLARE_MESSAGE_MAP() 
    
  2. 类外必须添加实现宏
    BEGIN_MESSAGE_MAP(theClass,baseClass)
    END_MESSAGE_MAP()
    

当一个类具备上述两个条件,这个类就可以按照消息映射机制来处理消息。

代码示例

#include <afxwin.h>
#include "resource.h"//自定义消息
#define WM_MYMESSAGE WM_USER+1001//1.定义自己的框架类CMyFrameWnd,派生自CFrameWnd类
class CMyFrameWnd :public CFrameWnd {DECLARE_MESSAGE_MAP()public:afx_msg int OnCreate(LPCREATESTRUCT param);afx_msg void OnPaint(void);afx_msg void OnMouseMove(UINT nKey, CPoint pt);afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);afx_msg void OnOpen();afx_msg void OnInitMenuPopup(CMenu* pPopup,UINT nPos, BOOL i);afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);int m_x;int m_y;CMenu menu;};BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)//使用标准消息实现WM_CREATE (窗口创建)消息的处理ON_WM_CREATE()//使用标准消息实现WM_PAINT(绘图)消息的处理ON_WM_PAINT()//使用标准消息实现鼠标移动消息ON_WM_MOUSEMOVE()//自定义消息ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)//命令消息ON_COMMAND(ID_OPEN, &CMyFrameWnd::OnOpen)//标准消息ON_WM_INITMENUPOPUP()//标准消息ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()//ON_WM_CREATE消息调用的函数
int CMyFrameWnd::OnCreate(LPCREATESTRUCT param) {//加载菜单方式二menu.LoadMenu(IDR_MENU1);this->SetMenu(&menu);AfxMessageBox("ON_WM_CREATE");//发送自己定义的消息::PostMessage(this->m_hWnd, WM_MYMESSAGE, 1, 2);return CFrameWnd::OnCreate(param);
}//ON_WM_PAINT消息调用的函数
void CMyFrameWnd::OnPaint(void) {PAINTSTRUCT ps = { 0 };HDC hdc = ::BeginPaint(this->m_hWnd, &ps);::TextOutA(hdc, m_x, m_y, "hello", 5);::EndPaint(m_hWnd, &ps);
}//OnMouseMove消息调用的函数
void CMyFrameWnd::OnMouseMove(UINT nKey, CPoint pt) {m_x = pt.x;m_y = pt.y;//hello 字符串跟着鼠标移动::InvalidateRect(this->m_hWnd, NULL, TRUE);}
//自定义消息
LRESULT CMyFrameWnd::OnMyMessage(WPARAM wParam, LPARAM lParam) {CString str;str.Format("wParam=%d, lParam=%d", wParam, lParam);AfxMessageBox(str);return 0;
}//命令消息 点击打开
void CMyFrameWnd::OnOpen()
{AfxMessageBox("ON_COMMAND");
}//设置菜单状态
void CMyFrameWnd::OnInitMenuPopup(CMenu* pPopup, UINT nPos, BOOL i) 
{//ID为ID_OPEN的菜单项前面打对号pPopup->CheckMenuItem(ID_OPEN,MF_CHECKED);
}//鼠标右键
void CMyFrameWnd::OnContextMenu(CWnd* pWnd, CPoint point)
{//HMENU hPopup = ::GetSubMenu(menu.m_hMenu,0);//展示菜单//::TrackPopupMenu(hPopup,TPM_LEFTALIGN|TPM_TOPALIGN,point.x,point.y,0,this->m_hWnd,NULL);//上下两种方式均可CMenu* pPopup = menu.GetSubMenu(0);//展示菜单pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN, point.x, point.y,this);
}//定义自己应用程序类CMyWinApp,派生自CWinApp类,
//并定义构造以及重写InitInstance虚函数,在函数中创建并显示窗口
class CMyWinApp :public CWinApp {public :CMyWinApp() {}virtual BOOL InitInstance() {CMyFrameWnd* pFrame = new CMyFrameWnd;//最后一个参数 加载菜单方式一(常用)//pFrame->Create(NULL,"MFCBase",WS_OVERLAPPEDWINDOW,CFrameWnd::rectDefault,NULL,(CHAR*)IDR_MENU1);pFrame->Create(NULL, "MFCBase");m_pMainWnd = pFrame;pFrame->ShowWindow(SW_SHOW);pFrame->UpdateWindow();return TRUE;}
};//3.定义CMyWinApp类的对象(程序的爆破点)
CMyWinApp theApp;

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

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

相关文章

docker学习笔记2-最佳实践

一、在容器中启动mysql的最佳实践 &#xff08;一&#xff09;查找目录 1、mysql的配置文件路径 /etc/mysql/conf.d 2、mysql的数据目录 /var/lib/mysql 3、环境变量 4、端口 mysql的默认端口3306。 &#xff08;二&#xff09;启动命令 docker run -d -p 3306:3306 …

Vue3核心源码解析

/packages/complier-core 定位​​&#xff1a;​​编译时核心​​&#xff0c;处理 Vue 模板的编译逻辑。​​核心功能​​&#xff1a; ​​模板解析​​&#xff1a;将 .vue 文件的模板语法&#xff08;HTML-like&#xff09;解析为 ​​抽象语法树 (AST)​​。​​转换优化…

n8n 中文系列教程_05.如何在本机部署/安装 n8n(详细图文教程)

n8n 是一款强大的开源工作流自动化工具&#xff0c;可帮助你连接各类应用与服务&#xff0c;实现自动化任务。如果你想快速体验 n8n 的功能&#xff0c;本机部署是最简单的方式。本教程将手把手指导你在 Windows 或 MacOS 上通过 Docker 轻松安装和运行 n8n&#xff0c;无需服务…

【python】pyCharm常用快捷键使用-(2)

pyCharm常用快捷键使用 快速导入任意类 【CTRLALTSPACE】代码补全【CTRLSHIFTENTER】代码快速修正【ALTENTER】代码调试快捷键

Docker 镜像、容器和 Docker Compose的区别

前言&#xff1a;Docker 的镜像、容器和 Docker Compose 是容器化技术的核心组件&#xff0c;以下是对它们的详细解析及使用场景说明。 ​​1、Docker 镜像&#xff08;Image&#xff09;​​ ​​定义​​&#xff1a; 镜像是只读模板&#xff0c;包含运行应用程序所需的代码、…

算法——背包问题(分类)

背包问题&#xff08;Knapsack Problem&#xff09;是一类经典的组合优化问题&#xff0c;广泛应用于资源分配、投资决策、货物装载等领域。根据约束条件和问题设定的不同&#xff0c;背包问题主要分为以下几种类型&#xff1a; 1. 0-1 背包问题&#xff08;0-1 Knapsack Probl…

多路由器通过RIP动态路由实现通讯(单臂路由)

多路由器通过RIP动态路由实现通讯&#xff08;单臂路由&#xff09; R1(开启端口并配置IP) Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shu Router(config-if)#no shutdown Router(config-if)#ip add 192.168.10.254 255.255.255.0 Router(c…

从底层设计原理分析并理解SQL 的执行顺序

​一、执行顺序的底层设计原理​​ ​​1. 数据源的确定与连接&#xff08;FROM → ON → JOIN&#xff09;​​ ​​FROM​​&#xff1a;数据库首先需要确定数据的物理来源&#xff0c;从磁盘加载表或子查询的原始数据。此时尚未应用任何筛选&#xff0c;仅读取元数据&#…

游戏引擎学习第237天:使用 OpenGL 显示图像

win32_game.cpp: 禁用 PFD_DOUBLEBUFFER 我们正在处理一个新的开发阶段&#xff0c;目标是在使用 OpenGL 渲染的同时能正常通过 OBS 进行直播。昨天我们已经尝试了一整天来解决这个问题&#xff0c;希望能找到一种方式让 OBS 能正确地捕捉到 OpenGL 的窗口画面。虽然我们不确定…

(二)mac中Grafana监控Linux上的MySQL(Mysqld_exporter)

框架&#xff1a;GrafanaPrometheusMysqld_exporter 一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装&#xff08;mac&#xff09;-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录…

GitHub 趋势日报 (2025年04月17日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1Anduin2017/HowToCook程序员在家做饭方法指南。Programmer’s guide about how to cook at home (Simplified Chinese onl…⭐ 224…

(一)mac中Grafana监控Linux上的CPU等(Node_exporter 安装使用)

框架&#xff1a;GrafanaPrometheusNode_exporter 机器状态监控(监控服务器CPU,硬盘&#xff0c;网络等状态) Node_exporter安装在被测服务器上&#xff0c;启动服务 各步骤的IP地址要换为被测服务器的IP地址Prometheus.yml的 targets值网页访问的ip部分grafana添加数据源的…

java IO/NIO/AIO

(✪▽✪)曼波~~~~&#xff01;让曼波用最可爱的赛马娘方式给你讲解吧&#xff01;(⁄ ⁄•⁄ω⁄•⁄ ⁄) &#x1f3a0;曼波思维导图大冲刺&#xff08;先看框架再看细节哦&#xff09;&#xff1a; &#x1f4da; 解释 Java 中 IO、NIO、AIO 的区别和适用场景&#xff1a; …

Silverlight发展历程(微软2021年已经停止支持Silverlight 5)

文章目录 Microsoft Silverlight 发展历程引言起源与背景&#xff08;2006-2007&#xff09;互联网技术格局与微软的挑战WPF/E 项目的启动 Silverlight 1.0 的诞生&#xff08;2007&#xff09;正式命名与首次发布初步的市场定位 Silverlight 2.0&#xff1a;真正的突破&#x…

【大数据、数据开发与数据分析面试题汇总(含答案)】

在大数据、数据开发与数据分析领域的面试中&#xff0c;扎实掌握各类知识点至关重要。以下是精心整理的面试题&#xff0c;涵盖单选题和多选题&#xff0c;助你备考一臂之力。 试题目录 大数据、数据开发与数据分析高频面试题解析1. 数据仓库分层架构设计2. 维度建模与范式建模…

Docker部署禅道21.6开源版本

将数据库相关环境变量分开&#xff0c;增加注释或空格使得命令更易读。 如果你的 MySQL 主机、端口等配置没有变化&#xff0c;应该确保这些信息是安全的&#xff0c;并考虑使用 Docker secrets 或环境变量配置来避免直接暴露敏感信息。 docker run -d -it --privilegedtrue …

Yocto项目实战教程 · 第4章:4.2小节-菜谱

&#x1f50d; B站相应的视频教程&#xff1a; &#x1f4cc; Yocto项目实战教程-第4章-4.2小节-菜谱 记得三连&#xff0c;标为原始粉丝。 在 Yocto 项目中&#xff0c;**菜谱&#xff08;Recipe&#xff09;**承载了包的配置信息、源码获取方式、编译与安装步骤&#xff0c;是…

【pytorch】torch.nn.Unfold操作

说明 一个代码里涉及到了unfold的操作&#xff0c;看了半天官网都没整明白维度怎么变化的&#xff0c;参考这个链接搞明白了&#xff1a; https://blog.csdn.net/ViatorSun/article/details/119940759 https://zhuanlan.zhihu.com/p/361140988 维度计算 输入&#xff08; N,…

Linux 固定IP地址

一.查看网口状态&#xff1a; $ ip a 二.配置静态IP文件&#xff1a; $ sudo vi /etc/network/interface auto eth0 iface eth0 inet static address 192.168.0.252 gateway 192.168.0.1 netmask 255.255.255.0 #network 192.168.0.0 #broadcast 192.168.0.255 三.重启网卡让新…

android的 framework 有哪些知识点和应用场景

Android Framework 知识点 1. 四大组件 Activity&#xff08;活动&#xff09; 是 Android 应用中最基本的组件&#xff0c;用于实现用户界面。一个 Activity 通常对应一个屏幕的内容。有自己的生命周期&#xff0c;包括 onCreate、onStart、onResume、onPause、onStop、onDe…