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


posted on 2008-06-14 12:42  Jacken  阅读(768)  评论(0)    收藏  举报

导航