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

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

相关推荐
CodeWithMe32 分钟前
【C/C++】C++中noexcept的妙用与性能提升
c语言·开发语言·c++
非著名架构师34 分钟前
C++跨平台开发实践:深入解析与常见问题处理指南
开发语言·c++
SuperCandyXu38 分钟前
leetcode0310. 最小高度树-medium
数据结构·c++·算法·leetcode
虾球xz1 小时前
游戏引擎学习第264天:将按钮添加到分析器
c++·学习·游戏引擎
YKPG1 小时前
C++学习-入门到精通-【5】类模板array和vector、异常捕获
java·c++·学习
南玖yy2 小时前
内存安全革命:工具、AI 与政策驱动的 C 语言转型之路
c语言·开发语言·c++·人工智能·安全·c++23·c++基础语法
愚润求学2 小时前
【Linux】自定义shell的编写
linux·运维·服务器·开发语言·c++·笔记
m0_555762902 小时前
手势、鼠标滑动实现界面切换
c++·qt
小王努力学编程3 小时前
高并发内存池(二):项目的整体框架以及Thread_Cache的结构设计
开发语言·c++·学习·算法
old_power3 小时前
C++使用PoDoFo库处理PDF文件
c++·pdf