开发者社区> shy丶gril> 正文

YY了一个消息处理基类

简介:
+关注继续查看

当我们要进行消息处理的时候,通常需要写出一系列的消息函数,然后再将这些函数指针赋值给一个函数指针数组。当要使用的时候,根据消息编号确定在数组中的位置。 在C++中,成员函数指针写着很不顺手。。于是做了一个基类。。这个基类有个限制,就是只能处理两个参数的消息处理函数。

第一个是消息ID,第二个就是消息内容。不过多数情况下已经够用。。。

 

  1. #include "stdafx.h"     
  2. #include <iostream>     
  3. #include <stdio.h>     
  4. #include <assert.h>     
  5. enum EDataType     
  6. {     
  7.     eData0,     
  8.     eData1,     
  9.     eData2,     
  10.     eData3,     
  11.     eData4,     
  12.     eData5,     
  13.     eData6,     
  14.     eData7,     
  15.     eData8,     
  16.     eDataCnt     
  17. };     
  18. template <class __T_,int _MAX_NUM = 100>     
  19. class CMsgBase     
  20. {     
  21.     typedef void (__T_::*ProcFunc)(void* pData);     
  22. public:     
  23.     CMsgBase()     
  24.     {     
  25.         for(int i = 0; i< _MAX_NUM;++i)     
  26.         {     
  27.             mDataOpList[i] = NULL;     
  28.         }     
  29.     
  30.     }     
  31.     void ProcMsg(int dataType,void* pData)     
  32.     {     
  33.         assert(dataType<_MAX_NUM);     
  34.         if(mDataOpList[dataType])     
  35.         (((__T_*)this)->*mDataOpList[dataType])(pData);     
  36.     }     
  37.     
  38.     void Register(int dataType,ProcFunc fn)     
  39.     {     
  40.         assert(dataType<_MAX_NUM);     
  41.         mDataOpList[dataType] = fn;     
  42.     }     
  43. protected:     
  44.     ProcFunc mDataOpList[_MAX_NUM];     
  45. };     
  46.     
  47. class CMsgHandler:public CMsgBase<CMsgHandler,eDataCnt>     
  48. {     
  49. public:     
  50.     CMsgHandler()     
  51.     {     
  52.         Register(0,&CMsgHandler::Func1);     
  53.     }     
  54.     virtual void Func1(void* pdata)     
  55.     {     
  56.         int p = *(int*)pdata;     
  57.         std::cout<<"Handler 0"<<p<<endl;     
  58.     }     
  59.     
  60. };     
  61.     
  62. int main()     
  63. {     
  64.     CMsgHandler *b=new CMsgHandler;     
  65.     b->ProcMsg(0,b);     
  66.     delete b;  
  67.     getchar();     
  68. }   

虽然是YY的,但至少执行正确。。。改天继续YY。

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2010/07/07/1940482.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MFC浅析(7) CWnd类虚函数的调用时机、缺省实现 .
1. Create 2. PreCreateWindow 3. PreSubclassWindow 4. PreTranslateMessage 5. WindowProc 6. OnCommand 7. OnNotify 8. OnChildNotify 9. DefWindowProc 10. DestroyWindow 11. PostNcDestroy CWnd作为MFC中最基本的与窗口打交道的类,完成了大部分窗口管理任务。
1042 0
MFC中CWnd类及其派生类对话框、消息处理、窗口操作
http://hi.baidu.com/xiaorida21/blog/item/8d8eb77a22eedee52e73b39e.html CWnd类 我们在屏幕上看到的所有对象都和窗口有关,它们或者派生于CWnd,属继承关系,如对话框、工具栏、状态栏、子控件;或者被CWnd合成,属服务员与服务对象关系,如图标、菜单、显示设备。
1236 0
ADI
[分享] 封装时间格式化函数
[分享] 封装时间格式化函数
74 0
MFC文档类视图接收字符串
MFC文档类视图接收字符串
9 0
委托(二):使用事件来对委托变量进行封装
          接上篇:委托(一):委托与方法                         在以前学习设计模式的时候,我们经常看到这样的代码:                                     可以这样说,委托和事件经常一起使用,感觉挺麻烦的,而且觉得委托已经挺好了,为什么还要加入事件呢?搞得挺复杂的。
887 0
接口,实现类,对象方法的调用关系.(查看程序输出)
分析的术语可能不是那么准确!有待加强~~~ 划线法真的不错.不过其实这个程序仔细看看也能很好分析. 只不过脑子容量还是有限的~好脑子不如画个图~将编程看作是一门艺术,而不单单是个技术。 敲打的英文字符是我的黑白琴键, 思维图纸画出的是我编写的五线谱。
914 0
【五、运算符重载实例分析】运算符重载实例、重载的机制、步骤、返回值及参数确定、友元函数与成员函数
【五、运算符重载实例分析】运算符重载实例、重载的机制、步骤、返回值及参数确定、友元函数与成员函数
14 0
MFC 消息处理顺序
MFC 消息传递顺序 LRESULT CALLBACK AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)   {       // special message which identifies the window a...
953 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载