MFC 的固定签名

书籍:《Visual C++ 2017从入门到精通》的2.1.3 手工写一个稍复杂的MFC程序

环境:visual studio 2022

内容:MFC 的固定签名

说明:大部分知识点来自腾讯元宝

1.是什么?

​在 MFC(Microsoft Foundation Classes)中,固定签名(Fixed Signature)​​ 是指消息处理函数必须遵循的标准函数定义形式,以确保 MFC 框架能够正确识别并调用它们来处理窗口消息。如果不遵循这一签名,消息将无法被正确分发和处理。

2.有什么用?

2.1 消息映射机制依赖:MFC 通过消息映射表(Message Map)将消息与处理函数关联。函数的参数顺序和类型必须与框架预期的完全一致,否则无法匹配。

​2.2 编译时和运行时检查:编译器通过函数签名检查是否与声明的 afx_msg 一致;运行时框架通过签名调用正确的函数。

​2.3 统一性:固定签名确保所有消息处理函数遵循统一的调用约定,简化了框架的设计和维护。

3.格式:

​MFC 消息处理函数的固定签名有两种常见形式:

3.1. ​标准窗口消息处理函数

afx_msg void OnMessage(UINT nParam1, WPARAM wParam, LPARAM lParam);

​**afx_msg**:宏,标识这是一个消息处理函数(可选,但推荐使用)。

​返回值:通常是 void,但某些消息(如 WM_COMMAND)也可以是 LRESULT。

​参数:

nParam1:通常是消息的附加参数(如控件 ID)。

wParam 和 lParam:Windows 消息的标准参数。

3.2. ​通用消息处理函数

afx_msg LRESULT OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam);

用于处理所有类型的消息(包括自定义消息)。

返回值:LRESULT,表示对消息的响应结果。

3.3 常见的固定签名示例:

消息类型 函数签名示例 用途
WM_PAINT afx_msg void OnPaint(); 绘制窗口内容
WM_LBUTTONDOWN afx_msg void OnLButtonDown(UINT, CPoint); 响应左键按下事件
WM_COMMAND afx_msg void OnCommand(UINT, WPARAM); 处理菜单或控件命令
自定义消息(如 WM_USER afx_msg LRESULT OnMyCustomMessage(WPARAM wParam, LPARAM lParam); 处理自定义消息

4.注意事项:

4.1 必须包含 afx_msg 宏:虽然某些情况下可以省略(如旧版本的 MFC),但显式声明 afx_msg 可提高代码的可读性和兼容性。

​4.2 参数顺序不可颠倒:例如,WM_COMMAND 的参数顺序是 (UINT nID, WPARAM wParam),而非 (WPARAM wParam, UINT nID)。

​4.3 自定义消息的处理:自定义消息(如 WM_USER + 1)需要通过 ON_MESSAGE 宏绑定,并使用通用签名:

cpp 复制代码
ON_MESSAGE(WM_MY_CUSTOM, &CMyWnd::OnMyCustomMessage)
void CMyWnd::OnMyCustomMessage(WPARAM wParam, LPARAM lParam) { ... }

5.总结:

固定签名是 MFC 消息映射机制的核心约定。

函数签名必须严格匹配 afx_msg 宏的定义和消息参数类型。

遵循固定签名可确保消息被正确分发和处理,避免运行时错误。

相关推荐
码农小韩1 小时前
基于Linux的C++学习——动态数组容器vector
linux·c语言·开发语言·数据结构·c++·单片机·学习
hui函数1 小时前
如何解决 pip install 编译报错 g++: command not found(缺少 C++ 编译器)问题
开发语言·c++·pip
CSDN_RTKLIB2 小时前
【std::vector】clear介绍
c++·stl
XiaoHu02072 小时前
Linux多线程(详细全解)
linux·运维·服务器·开发语言·c++·git
苏宸啊2 小时前
C++(二)类和对象上篇
开发语言·c++
fqbqrr2 小时前
2601C++,编译时连接两个串指针
c++
嵌入式进阶行者2 小时前
【算法】TLV格式解析实例:华为OD机考双机位A卷 - TLV解析 Ⅱ
数据结构·c++·算法
OC溥哥9992 小时前
Paper MinecraftV3.0重大更新(下界更新)我的世界C++2D版本隆重推出,拷贝即玩!
java·c++·算法
Jayden_Ruan2 小时前
C++蛇形方阵
开发语言·c++·算法
星火开发设计2 小时前
C++ map 全面解析与实战指南
java·数据结构·c++·学习·算法·map·知识