C++ EventHandler v0.02
今天对C++ EventHandler 进行了改善...
// 下面是EventHandler.h 文件.
#pragma once
#include <list>
using namespace std;
class EventHandlerBase
{
public:
EventHandlerBase(int uMsgID) : m_uMsgID(uMsgID){}
virtual void HandleEvent(int uMsgID, int wParam, int lParam) = 0;
int GetMsgID() { return m_uMsgID; }
protected:
int m_uMsgID;
};
template <class T>
class EventHandler : public EventHandlerBase
{
public:
typedef void (T::*FuncType)(int,int);
EventHandler(int uMsgID, T *pObj, FuncType func)
: EventHandlerBase(uMsgID), m_pObj(pObj), m_func(func)
{
}
void HandleEvent(int uMsgID, int wParam, int lParam)
{
if (uMsgID == m_uMsgID)
{
(m_pObj->*m_func)(wParam, lParam);
}
}
T *GetObjectPtr() { return m_pObj;}
protected:
T *m_pObj;
FuncType m_func;
};
class EventDispatcher
{
public:
template <typename ObjT>
void AddEventHandler(int uMsgID, ObjT *pObj, void (ObjT::*func)(int,int))
{
EventHandlerBase *pEvtHandler = new EventHandler<ObjT>(uMsgID, pObj, func);
m_lstEventHandlers.push_back(pEvtHandler);
}
template <class ObjT>
void RemoveEventHandler(int uMsgID, ObjT *pObj)
{
list<EventHandlerBase*>::iterator iterHandlers = m_lstEventHandlers.begin();
for (; iterHandlers != m_lstEventHandlers.end(); iterHandlers++)
{
EventHandler<ObjT> *pCurObj = (EventHandler<ObjT>*)*iterHandlers;
if (pCurObj->GetObjectPtr() == pObj && (*iterHandlers)->GetMsgID() == uMsgID)
{
iterHandlers = m_lstEventHandlers.erase(iterHandlers);
}
}
}
void DispatchEvent(int uMsgID, int wParam, int lParam)
{
list<EventHandlerBase*>::iterator iterHandlers = m_lstEventHandlers.begin();
for (; iterHandlers != m_lstEventHandlers.end(); iterHandlers++)
{
if ((*iterHandlers)->GetMsgID() == uMsgID)
(*iterHandlers)->HandleEvent(uMsgID, wParam, lParam);
}
}
protected:
list<EventHandlerBase*> m_lstEventHandlers;
};
// 下面是测试程序main.cpp:
#include "EventHandler.h"
EventDispatcher g_evtDispatcher;
class Test
{
public:
void Handle(int lParam, int wParam)
{
printf("Hey, I am handling the event!"n");
}
};
int main(int argc, char* argv[])
{
Test test;
g_evtDispatcher.AddEventHandler(100, &test, Test::Handle);
g_evtDispatcher.DispatchEvent(100, 20, 20);
g_evtDispatcher.RemoveEventHandler(100, &test);
g_evtDispatcher.DispatchEvent(100, 30, 30);
return 0;
}
// 下面是EventHandler.h 文件.
#pragma once
#include <list>
using namespace std;
class EventHandlerBase
{
public:
EventHandlerBase(int uMsgID) : m_uMsgID(uMsgID){}
virtual void HandleEvent(int uMsgID, int wParam, int lParam) = 0;
int GetMsgID() { return m_uMsgID; }
protected:
int m_uMsgID;
};
template <class T>
class EventHandler : public EventHandlerBase
{
public:
typedef void (T::*FuncType)(int,int);
EventHandler(int uMsgID, T *pObj, FuncType func)
: EventHandlerBase(uMsgID), m_pObj(pObj), m_func(func)
{
}
void HandleEvent(int uMsgID, int wParam, int lParam)
{
if (uMsgID == m_uMsgID)
{
(m_pObj->*m_func)(wParam, lParam);
}
}
T *GetObjectPtr() { return m_pObj;}
protected:
T *m_pObj;
FuncType m_func;
};
class EventDispatcher
{
public:
template <typename ObjT>
void AddEventHandler(int uMsgID, ObjT *pObj, void (ObjT::*func)(int,int))
{
EventHandlerBase *pEvtHandler = new EventHandler<ObjT>(uMsgID, pObj, func);
m_lstEventHandlers.push_back(pEvtHandler);
}
template <class ObjT>
void RemoveEventHandler(int uMsgID, ObjT *pObj)
{
list<EventHandlerBase*>::iterator iterHandlers = m_lstEventHandlers.begin();
for (; iterHandlers != m_lstEventHandlers.end(); iterHandlers++)
{
EventHandler<ObjT> *pCurObj = (EventHandler<ObjT>*)*iterHandlers;
if (pCurObj->GetObjectPtr() == pObj && (*iterHandlers)->GetMsgID() == uMsgID)
{
iterHandlers = m_lstEventHandlers.erase(iterHandlers);
}
}
}
void DispatchEvent(int uMsgID, int wParam, int lParam)
{
list<EventHandlerBase*>::iterator iterHandlers = m_lstEventHandlers.begin();
for (; iterHandlers != m_lstEventHandlers.end(); iterHandlers++)
{
if ((*iterHandlers)->GetMsgID() == uMsgID)
(*iterHandlers)->HandleEvent(uMsgID, wParam, lParam);
}
}
protected:
list<EventHandlerBase*> m_lstEventHandlers;
};
// 下面是测试程序main.cpp:
#include "EventHandler.h"
EventDispatcher g_evtDispatcher;
class Test
{
public:
void Handle(int lParam, int wParam)
{
printf("Hey, I am handling the event!"n");
}
};
int main(int argc, char* argv[])
{
Test test;
g_evtDispatcher.AddEventHandler(100, &test, Test::Handle);
g_evtDispatcher.DispatchEvent(100, 20, 20);
g_evtDispatcher.RemoveEventHandler(100, &test);
g_evtDispatcher.DispatchEvent(100, 30, 30);
return 0;
}
浙公网安备 33010602011771号