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 宏的定义和消息参数类型。

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

相关推荐
Ring__Rain1 小时前
visual studio 常用的快捷键(已经熟悉的就不记录了)
c++·git·visual studio
辛姜_千尘红回1 小时前
AT_abc398_e [ABC398E] Tree Game 题解
c语言·c++·笔记·算法
啊阿狸不会拉杆2 小时前
数据结构-限定性线性表 - 栈与队列
java·c语言·数据结构·c++·python·算法
ChiaWei Lee2 小时前
【C++初学】C++核心编程(一):内存管理和引用
c++
刃神太酷啦2 小时前
基础算法篇(5)(蓝桥杯常考点)—动态规划(C/C++)
数据结构·c++·算法·leetcode·蓝桥杯·动态规划·蓝桥杯c++组
kchmmd2 小时前
基于QtC++音乐播放器whisper语音转文字歌词解析
c++·qt
444A4E3 小时前
二叉搜索树完全解析:从理论到C++手把手实现
数据结构·c++
yy_xzz3 小时前
从0到1使用C++操作MSXML
xml·c++·msxml
martian6654 小时前
C++算法优化实战:破解性能瓶颈,提升程序效率
开发语言·c++·性能优化
new一个奶黄包4 小时前
MySql入门
c语言·数据库·c++·mysql·adb