__event
聲明事件。
語法
__event method-declarator ;__event __interface interface-specifier;__event member-declarator;
備注
關鍵字 __event 可應用于方法聲明、接口聲明或數據成員聲明。但是,不能使用 __event 關鍵字限定嵌套類的成員。
根據您的事件源和接收器是本機 C++、COM 還是托管 (.NET Framework),您可使用下列構造作為事件:
在事件接收器中使用 __hook 可將處理程序方法與事件方法關聯。請注意,使用 __event 關鍵字創建一個事件之后,將在調用此事件時調用后來掛鉤到它的所有事件處理程序。
__event 方法聲明不能具有定義;定義是隱式生成的,因此可將事件方法當做任何普通方法一樣調用。
System_CAPS_note注意
模板類或結構不能包含事件。
本機事件
本機事件是方法。返回類型通常是 HRESULT 或 void,但可以是任何整型(包括 enum)。當事件使用整數返回類型時,如果事件處理程序返回非零值,則會定義錯誤條件,在這種情況下,引發的事件將調用其他委托。
// Examples of native C++ events:__event void OnDblClick();__event HRESULT OnClick(int* b, char* s);
有關代碼示例,請參閱本機 C++ 中的事件處理。
COM 事件
COM 事件是接口。事件源接口中的方法的參數應為 in 參數(但這不是強制要求的),因為 out 參數在多播時無用。如果使用 out 參數,則將發出 1 級警告。
返回類型通常是 HRESULT 或 void,但可以是任何整型(包括 enum)。當事件使用整數返回類型并且事件處理程序返回非零值時,這是錯誤情況,此時引發的事件將中止對其他委托的調用。請注意,編譯器會自動將一個事件源接口標記為生成的 IDL 中的源。
COM 事件源的 __event 之后始終需要 __interface 關鍵字。
// Example of a COM event:__event __interface IEvent1;
有關代碼示例,請參閱 COM 中的事件處理。
托管事件
有關新語法中的編碼事件的信息,請參閱event(C++ 組件擴展)。
托管事件是數據成員或方法。當與事件一起使用時,委托的返回類型必須符合公共語言規范。事件處理程序的返回類型必須與委托的返回類型匹配。有關委托的詳細信息,請參閱 __delegate。如果托管事件是數據成員,則其類型必須是指向委托的指針。
在 .NET Framework 中,您可以將數據成員視為方法本身(即,其對應委托的 Invoke 方法)。您必須預定義用于聲明托管事件數據成員的委托類型。相反,如果尚未定義對應的托管委托,則托管事件方法將隱式定義它。例如,您可以將事件值(如 OnClick)聲明為下面所示的事件:
// Examples of managed events:__event ClickEventHandler* OnClick; // data member as event__event void OnClick(String* s); // method as event
隱式聲明托管事件時,您可以指定添加或移除添加或移除事件處理程序時將調用的 add 和 remove 訪問器。您還可以定義從類外部調用(引發)事件的方法。
示例:本機事件
// EventHandling_Native_Event.cpp// compile with: /c[event_source(native)]class CSource {public: __event void MyEvent(int nValue);};
示例:COM 事件
// EventHandling_COM_Event.cpp// compile with: /c#define _ATL_ATTRIBUTES 1#include <atlbase.h>#include <atlcom.h>[ module(dll, name="EventSource", uuid="6E46B59E-89C3-4c15-A6D8-B8A1CEC98830") ];[ dual, uuid("00000000-0000-0000-0000-000000000002") ]__interface IEventSource { [id(1)] HRESULT MyEvent();}; [ coclass, uuid("00000000-0000-0000-0000-000000000003"), event_source(com) ]class CSource : public IEventSource {public: __event __interface IEventSource; HRESULT FireEvent() { __raise MyEvent(); return S_OK; }};
示例:托管事件
// EventHandling_Managed_Event.cpp// compile with: /clr:oldSyntax /cusing namespace System;[event_source(managed)]public __gc class CPSource {public: __event void MyEvent(Int16 nValue);};
將特性應用于事件時,您可以指定特性應用于生成的方法還是生成的委托的 Invoke 方法。默認值 (event:) 用于將特性應用于事件。
// EventHandling_Managed_Event_2.cpp// compile with: /clr:oldSyntax /cusing namespace System;[attribute(All, AllowMultiple=true)]public __gc class Attr {};public __delegate void D();public __gc class X {public: [method:Attr] __event D* E; [returnvalue:Attr] __event void noE();};
__raise
強調一個事件的調用站點。
__raise method-declarator;
備注
在托管代碼中,事件只能從定義它的類中引發。
說明
模板類或結構不能包含事件。
示例
// EventHandlingRef_raise.cppstruct E { __event void func1(); void func1(int) {} void func2() {} void b() { __raise func1(); __raise func1(1); // C3745: 'int Event::bar(int)': // only an event can be 'raised' __raise func2(); // C3745 }};int main() { E e; __raise e.func1(); __raise e.func1(1); // C3745 __raise e.func2(); // C3745}