Windows消息分发器设计与实现

本文介绍了一个基于Windows MFC的CMsgDispatch类,用于消息分发。类中实现了消息注册、注销和分发功能,允许多个窗口处理同一消息。在系统初始化时调用Init(),其他类注册感兴趣的消息,通过DefWindowProc()实现消息循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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线程安全机制,确保消息处理在主线程中进行,避免多线程同步问题,提升了应用程序的稳定性和响应性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘色的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值