惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - Jacken

ios basics 关于 php mvc 转: Basic JavaScript Part 8: Namespaces Simple JavaScript Inheritance javascript 命名空间 继承 实现 转: CSS网页布局教程:绝对定位和相对定位 js 类与对象 div 垂直居中 布局 boost signal 用法与用处... Flash嵌入纯Win32程序 及 事件接收 消息发送器设计 工若善其器,必然利其事。 HTML5开发工具选择 项目 "差不多成功? 简直就是失败". html css 布局 ubuntu 使用 wifi 连接上网 用背景图片填充Edit控件... 游戏类初步一.. C++的异常处理方法之一. - Jacken - 博客园 在命令行中使用cl工具生成纯资源的DLL文件...
C++ EventHandler v0.02
Jacken · 2008-06-15 · via 博客园 - Jacken

今天对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;
}