0. 引言
在Windows应用程序开发中,消息处理是实现用户界面响应和异步通信的核心部分。本文将深入探讨一个基于MFC(Microsoft Foundation Classes)框架开发的消息分发器模块,旨在帮助开发人员理解其设计原理和实现细节。
1.概述
消息分发器模块是从一个实际的Windows客户端项目中提取出来的,用于管理和分发不同类型消息到注册的窗口处理程序。它利用了MFC提供的窗口和消息处理机制,为应用程序提供了灵活且高效的消息传递功能。
2. 类设计与功能
CMsgDispatch 类:
#include <afxwin.h>
#include <map>
#include <vector>
typedef unsigned int u32;
class CMsgDispatch : public CWnd
{
public:
// 构造函数和析构函数
CMsgDispatch();
virtual ~CMsgDispatch();
// 初始化和销毁消息分发器
static void Init();
static void Destroy();
// 获取消息接收窗口句柄
static HWND GetMsgReceiveHandle();
// 注册和取消注册消息处理函数
static void RegMsgHandler(u32 nMsgId, HWND hHandleWnd);
static void DetachMsgHandler(u32 nMsgId, HWND hHandleWnd);
// 发送消息到消息分发器窗口
static LRESULT SendMessage(u32 dwMessage, WPARAM wParam, LPARAM lParam);
protected:
// 预创建窗口,用于设置窗口样式等
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
// 消息处理函数,重写 CWnd 的默认消息处理函数
virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
private:
DECLARE_MESSAGE_MAP()
private:
// 内部消息分发函数
void DisPatchMsg();
private:
static CMsgDispatch *m_pMySelf; // 静态指针,实现单例模式
static std::map<u32, std::vector<HWND>> m_mapDispatch; // 存储消息和处理窗口的映射
};
// 初始化静态成员
CMsgDispatch* CMsgDispatch::m_pMySelf = nullptr;
std::map<u32, std::vector<HWND>> CMsgDispatch::m_mapDispatch;
3. 类功能详解
-
构造函数和析构函数: 初始化和释放资源,确保对象生命周期管理的完整性和安全性。
-
初始化和销毁: 提供静态方法
Init()
和Destroy()
,用于创建和销毁消息分发器实例,实现单例模式,确保仅有一个全局实例存在。 -
消息注册与取消注册: 通过
RegMsgHandler()
和DetachMsgHandler()
函数,允许其他模块注册和取消注册对特定消息的处理窗口,支持多个窗口对同一消息的处理。 -
消息发送与处理:
SendMessage()
函数允许通过消息分发器向注册的窗口发送消息,DefWindowProc()
函数重写了基类CWnd
的默认消息处理函数,根据消息类型从m_mapDispatch
中查找注册的处理窗口,并将消息传递给这些窗口。
4. 使用示例及实际应用
// 示例代码展示了如何在应用程序初始化时使用消息分发器
void InitializeMessageDispatcher()
{
CMsgDispatch::Init();
CMsgDispatch::RegMsgHandler(GET_DEVICESTAT_ACK, m_hWnd);
CMsgDispatch::RegMsgHandler(GET_DEVICESTAT_NACK, m_hWnd);
CMsgDispatch::RegMsgHandler(GET_DEVICESTAT_NOTIFY, m_hWnd);
}
5. 技术细节与优化建议
-
单例模式实现: 使用静态成员
m_pMySelf
确保只有一个消息分发器实例存在,避免资源浪费和多次初始化问题。 -
消息处理机制: 利用
map
结构存储消息类型和处理窗口列表,通过重写DefWindowProc()
函数实现消息的动态分发,支持灵活的消息管理和处理。 -
线程安全性: 基于 MFC 的
CWnd
类,内置了GUI线程安全机制,确保消息处理在主线程中进行,避免多线程同步问题,提升了应用程序的稳定性和响应性能。