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

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

相关推荐
视睿10 小时前
【C++练习】06.输出100以内的所有素数
开发语言·c++·算法·机器人·无人机
保持低旋律节奏11 小时前
CPP——OJ试题,string、vector、类(题三)初步应用
c++
君生我老11 小时前
C++ string类常用操作
c++
愿天堂没有C++12 小时前
C++——基础
c++
zzzsde12 小时前
【c++】深入理解string类(3):典型OJ题
开发语言·c++
青瓦梦滋12 小时前
【数据结构】哈希——位图与布隆过滤器
开发语言·数据结构·c++·哈希算法
深思慎考12 小时前
LinuxC++——etcd分布式键值存储系统入门
linux·c++·etcd
mahuifa13 小时前
C++(Qt)软件调试---Linux动态库链接异常排查(38)
linux·c++·动态库·ldd·异常排查
Juan_201213 小时前
P3051题解
c++·数学·算法·题解
深思慎考13 小时前
LinuxC++——etcd分布式键值存储系统API(libetcd-cpp-api3)下载与二次封装
linux·c++·etcd