C++委托事件文档格式.docx

上传人:b****6 文档编号:18143462 上传时间:2022-12-13 格式:DOCX 页数:50 大小:39.90KB
下载 相关 举报
C++委托事件文档格式.docx_第1页
第1页 / 共50页
C++委托事件文档格式.docx_第2页
第2页 / 共50页
C++委托事件文档格式.docx_第3页
第3页 / 共50页
C++委托事件文档格式.docx_第4页
第4页 / 共50页
C++委托事件文档格式.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

C++委托事件文档格式.docx

《C++委托事件文档格式.docx》由会员分享,可在线阅读,更多相关《C++委托事件文档格式.docx(50页珍藏版)》请在冰豆网上搜索。

C++委托事件文档格式.docx

(*PEVENT_PARAM_NORETURN)(void 

*, 

int);

4.typedef 

(*PEVENT_PARAM_RETURN)(void 

5. 

6.class 

CNotifyClass 

7.{ 

8.public:

9. 

CNotifyClass(void);

10. 

~CNotifyClass(void);

11. 

12.public:

13. 

bool 

RegisterEvent(PEVENT_NOPARAM_NORETURN 

pFunc1, 

PEVENT_NOPARAM_RETURN 

pFunc2, 

14. 

PEVENT_PARAM_NORETURN 

pFunc3, 

PEVENT_PARAM_RETURN 

pFunc4, 

*pParameter);

15. 

UnRegisterEvent();

16. 

17. 

DoNotifyEventWork();

18. 

19.protected:

20. 

PEVENT_NOPARAM_NORETURN 

m_pNoParam_NoReturn_EventHandler;

21. 

m_pNoParam_Return_EventHandler;

22. 

m_pParam_NoReturn_EventHandler;

23. 

m_pParam_Return_EventHandler;

24. 

25.protected:

26. 

*m_pEventParameter;

27.};

类实现如下:

1.#include 

"

NotifyClass.h"

 

2. 

3.CNotifyClass:

:

CNotifyClass(void) 

4. 

m_pEventParameter(NULL) 

 

m_pNoParam_NoReturn_EventHandler(NULL) 

6. 

m_pNoParam_Return_EventHandler(NULL) 

7. 

m_pParam_NoReturn_EventHandler(NULL) 

8. 

m_pParam_Return_EventHandler(NULL) 

9.{ 

10.} 

12.CNotifyClass:

~CNotifyClass(void) 

13.{ 

15.} 

17.bool 

18.CNotifyClass:

19. 

*pParameter) 

20.{ 

if 

(NULL 

!

m_pNoParam_NoReturn_EventHandler) 

return 

false;

m_pEventParameter 

pParameter;

m_pNoParam_NoReturn_EventHandler 

pFunc1;

25. 

m_pNoParam_Return_EventHandler 

pFunc2;

m_pParam_NoReturn_EventHandler 

pFunc3;

27. 

m_pParam_Return_EventHandler 

pFunc4;

28. 

true;

29.} 

30. 

31.void 

32.CNotifyClass:

UnRegisterEvent() 

33.{ 

34. 

NULL;

35. 

36. 

37. 

38. 

39.} 

40. 

41.void 

42.CNotifyClass:

DoNotifyEventWork() 

43.{ 

44. 

iResult 

0;

45. 

(m_pNoParam_NoReturn_EventHandler 

NULL) 

46. 

m_pNoParam_NoReturn_EventHandler(m_pEventParameter);

47. 

(m_pNoParam_Return_EventHandler 

48. 

m_pNoParam_Return_EventHandler(m_pEventParameter);

49. 

50. 

10;

51. 

(m_pParam_Return_EventHandler 

52. 

m_pParam_Return_EventHandler(m_pEventParameter, 

iResult);

53. 

54. 

(m_pParam_NoReturn_EventHandler 

55. 

m_pParam_NoReturn_EventHandler(m_pEventParameter, 

56.} 

类CNotifyClass声明时要提供类似如下的事件处理函数声明,所有接收事件的对象都要使用如下的函数声明来定义函数

(*PEVENT_NOPARAM_NORETURN)(void*);

事件接收对象类通过调用RegisterEvent和UnRegisterEvent注册接收消息或取消注册不再接收消息,当会触发消息的工作方法DoNotifyEventWork被调用时,会检测哪些事件被注册了,被注册了就调用,就如同进行了事件通知。

(2)、事件接收对象类或事件处理对象类CRecvEventClass的类定义如下:

1.class 

CRecvEventClass 

2.{ 

3.public:

CRecvEventClass(void);

~CRecvEventClass(void);

7.public:

DoWork(int 

iArg);

10.protected:

static 

OnNoParamNoReturnEvent(void 

*pvParam);

12. 

OnNoParamReturnEvent(void 

OnParamNoReturnEvent(void 

*pvParam, 

OnParamReturnEvent(void 

16.protected:

m_ncNotify;

m_nNum;

19.};

RecvEventClass.h"

3.CRecvEventClass:

CRecvEventClass(void) 

4.{ 

m_ncNotify.RegisterEvent(OnNoParamNoReturnEvent, 

OnNoParamReturnEvent, 

OnParamNoReturnEvent, 

OnParamReturnEvent, 

this);

6.} 

8.CRecvEventClass:

~CRecvEventClass(void) 

m_ncNotify.UnRegisterEvent();

11.} 

13.int 

14.CRecvEventClass:

iArg) 

15.{ 

m_nNum 

iArg;

m_ncNotify.DoNotifyEventWork();

19.} 

21.void 

22.CRecvEventClass:

*pvParam) 

23.{ 

_tprintf(_T("

Run 

OnNoParamNoReturnEvent\n"

));

(pvParam 

*p 

reinterpret_cast<

*>

(pvParam);

p->

29. 

30.} 

31. 

32.int 

33.CRecvEventClass:

34.{ 

OnNoParamReturnEvent\n"

39. 

41. 

42. 

else 

43. 

44.} 

46.void 

47.CRecvEventClass:

48.{ 

OnParamNoReturnEvent\n"

iArg 

55.} 

56. 

57.int 

58.CRecvEventClass:

59.{ 

60. 

OnParamReturnEvent\n"

61. 

iRet 

62. 

iRet;

63.} 

这里事件接收对象类或事件处理对象类CRecvEventClass在定义时一定要定义同事件触发类CNotifyClass提供的方法声明相同的方法来接收处理事件,由于CNotifyClass定义的方法声明是普通的指向函数指针,不包含对象的this指针传递,所以这种方法不能是实例成员函数,只能是静态成员方法,就如同

1.static 

当定义了事件处理方法后,可以通过调用类CNotifyClass的方法RegisterEvent和UnRegisterEvent注册接收消息或取消注册不再接收消息,本例是在构造和析构函数中调用的,当CNotifyClass类的DoNotifyEventWork方法被调用时,就会通过函数指针事件通知到类CRecvEventClass,在事件处理方法中为了能区分CRecvEventClass的不同实例,所以要在类CNotifyClass的方法RegisterEvent中提供了pParameter参数,通常CRecvEventClass在调用RegisterEvent时传递对象本身的this指针,这样在事件处理方法中就可以通过pvParam参数得到这个指针的类实例的this指针,就像OnNoParamNoReturnEvent中的代码

1.CRecvEventClass:

3. 

9.} 

可以直接将pvParam参数转化为CRecvEventClass类实例的指针,然后就像成员方法一样访问类实例的其他方法和成员了。

(3)、使用的例子及输出

1.int 

_tmain(int 

argc, 

_TCHAR* 

argv[]) 

//2个对象,虽然类里用的静态方法,但是不会影响到不同对象的调用,互相不会干扰其他的对象的状态 

rec1, 

rec2;

iIn, 

iOut;

iIn 

iOut 

rec1.DoWork(iIn);

StaticFunctionEvent 

test 

1, 

Init:

%d, 

Result:

%d\n"

), 

iOut);

30;

2, 

60;

rec2.DoWork(iIn);

3, 

TCHAR 

c;

_tscanf(_T("

%c"

&

c);

20.} 

输出结果为:

1.Run 

OnNoParamNoReturnEvent 

2.Run 

OnNoParamReturnEvent 

3.Run 

OnParamReturnEvent 

4.Run 

OnParamNoReturnEvent 

5.StaticFunctionEvent 

10, 

70 

6.Run 

7.Run 

8.Run 

9.Run 

10.StaticFunctionEvent 

30, 

90 

11.Run 

12.Run 

13.Run 

14.Run 

15.StaticFunctionEvent 

60, 

120 

从输出结果上看事件是被顺次调用了,至于程序中的变量值,主要表明这些事件执行的而动作是对应于实例的,不是因为是静态方法就是对应于类的。

2、 

实现的要点

(1)、事件触发类的实现要点

a、 

事件触发类必须要定义要处理事件的函数声明

b、 

事件触发类要定义相应函数声明类型的成员变量

1.PEVENT_NO

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1