介绍:在一处对消息进行统一的管理,界面通过注册订阅消息,将消息注册到管理的区域(这个管理区域可以用map<int, set<CWnd*> >来保存注册的窗口句柄,前面的int标示消息类型),那么当有此类型的消息到来时,可以通过发送接口发给所有订阅者,界面也可以取消订阅消息,在界面模块很多的情况下,可以有效的管理消息。
1. //MessageMgr.h 中定义:
#include <map>
#include <set>
管理消息及窗口句柄的区域:
std::map<int, std:set<CWnd*> > m_msgListen;
//界面通过此函数注册订阅消息
int ListenMessage(int nMessageType, CWnd* wnd);
//界面通过此函数取消注册订阅
int UnListenMessage(int nMessageType, CWnd* wnd);
//调用此函数可以对某种消息的所有订阅者发送消息
int PostMessage(int nMessageType, WPARAM wParam, LPARAM lParam);
2.//MessageMgr.cpp 中实现:
int DataMgr::ListenMessage(int nMessageType, CWnd* wnd)
{
m_msgListen[nMessageType].insert(wnd);
return 0;
}
int DataMgr::UnListenMessage(int nMessageType, CWnd* wnd)
{
std::set<CWnd*>::iterator itr = m_msgListen[nMessageType].find(wnd);
if (itr != NULL)
{
delete *itr;
m_msgListen[nMessageType].erase(itr);
}
return 0;
}
int DataMgr::PostMessage(int nMessageType, WPARAM wParam, LPARAM lParam)
{
std::set<CWnd*>::iterator itr = m_msgListen[nMessageType].begin();
for (; itr != m_msgListen[nMessageType].end(); itr++)
{
::PostMessage((*itr)->m_hWnd, nMessageType, wParam, lParam);
}
return 0;
}
3.这多半是多线程操作,故要添加线程锁,这里不介绍。