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;
}






posted on 2008-06-15 11:31  Jacken  阅读(1080)  评论(0)    收藏  举报

导航