C++委托事件文档格式.docx
- 文档编号:18143462
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:50
- 大小:39.90KB
C++委托事件文档格式.docx
《C++委托事件文档格式.docx》由会员分享,可在线阅读,更多相关《C++委托事件文档格式.docx(50页珍藏版)》请在冰豆网上搜索。
(*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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 委托 事件
![提示](https://static.bdocx.com/images/bang_tan.gif)