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

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

相关推荐
f***01935 小时前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
合方圆~小文5 小时前
球型摄像机作为现代监控系统的核心设备
java·数据库·c++·人工智能
椰萝Yerosius6 小时前
[题解]2024CCPC郑州站——Z-order Curve
c++·算法
滨HI09 小时前
C++ opencv简化轮廓
开发语言·c++·opencv
学习路上_write9 小时前
FREERTOS_互斥量_创建和使用
c语言·开发语言·c++·stm32·单片机·嵌入式硬件
闻缺陷则喜何志丹10 小时前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考
BestOrNothing_201511 小时前
一篇搞懂 C++ 重载:函数重载 + 运算符重载,从入门到会用(含 ++、<<、== 实战)
c++·函数重载·运算符重载·operator·前置后置++·重载与重写
2501_9411444211 小时前
Python + C++ 异构微服务设计与优化
c++·python·微服务
程序猿编码11 小时前
PRINCE算法的密码生成器:原理与设计思路(C/C++代码实现)
c语言·网络·c++·算法·安全·prince
charlie11451419112 小时前
深入理解C/C++的编译链接技术6——A2:动态库设计基础之ABI设计接口
c语言·开发语言·c++·学习·动态库·函数