C++ EventHandler v0.01
#pragma once
#include <list>
using namespace std;
class EventHandler
{
public:
virtual void HandleEvent(int uMsgID, int wParam, int lParam) = 0;
protected:
int m_uMsgID;
};
template <class T>
class TypedEventHandler : public EventHandler
{
public:
void HandleEvent(int uMsgID, int wParam, int lParam)
{
if (uMsgID == m_uMsgID)
{
(pObj->*m_func)(wParam, lParam);
}
}
protected:
T *pObj;
void (T::*m_func)(int, int);
};
class Window
{
public:
template <class ObjT>
void AddEventHandler(int uMsgID, ObjT *pObj, void (ObjT::*func)(int,int))
{
EventHandler *pEvtHandler = new TypedEventHandler<ObjT>(uMsgID, pObj, func);
m_lstEventListners.push_back(pEvtHandler);
}
void AttachChildWindow(Window *pChildWindow)
{
m_lstChildWindows.push_back(pChildWindow);
}
void RemoveChildWindow(Window *pChildWindow)
{
}
void HandleEvent(int uMsgID, int wParam, int lParam)
{
list<Window*>::iterator iterChildWins = m_lstChildWindows.begin();
for (; iterChildWins != m_lstChildWindows.end(); iterChildWins++)
{
(*iterChildWins)->HandleEvent(uMsgID, wParam, lParam);
}
list<EventHandler*>::iterator iterHandlers = m_lstEventHandlers.begin();
for (; iterHandlers != m_lstEventHandlers.end(); iterHandlers++)
{
(*iterHandlers)->HandleEvent(uMsgID, wParam, lParam);
}
}
protected:
list<EventHandler*> m_lstEventHandlers;
list<Window*> m_lstChildWindows;
Window *m_pParentWindow;
};
浙公网安备 33010602011771号