__event
宣告事件。
__event method-declarator;
__event __interface interface-specifier;
__event member-declarator;
備註
關鍵字 __event 可以套用至方法宣告、介面宣告或資料成員宣告。 但是,您無法使用 __event 關鍵字限定巢狀類別的成員。
根據您的來源和事件接收者是否為原生 C++, COM,或者 Managed (.NET Framework),您可以使用下列建構為事件:
原生 C++ |
COM |
處理 (.NET Framework) |
---|---|---|
方法 |
— |
方法 |
— |
interface |
— |
— |
— |
資料成員 |
使用 __hook 在事件接收器使方法與事件處理常式方法。 請注意,在建立 __event 關鍵字事件後,所有事件處理常式接著會攔截該事件會呼叫,當呼叫事件。
__event 方法宣告不能有定義;定義隱含產生,因此,事件可以呼叫方法,就像它是所有泛型方法。
注意事項 |
---|
樣板類別或結構不能包含事件。 |
原生事件。
原生事件是方法。 傳回型別通常是 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 的 來源 。
__interface 關鍵字在 __event 之後所必備 COM 事件來源。
// Example of a COM event:
__event __interface IEvent1;
提供範例程式碼 處理 COM 中的事件 參閱。
Managed 事件
如需在新語法中的程式碼撰寫事件的詳細資訊,請參閱 事件 (Visual C++)。
Managed 事件是資料成員或方法。 與一起使用時,事件委派的傳回型別必須相容 (Compliant) 於 Common Language Specification。 事件處理常式的傳回型別必須與委派的傳回型別。 如需委派的詳細資訊,請參閱 __delegate。 如果 Managed 事件是資料成員,它的型別必須是指標指派給委派。
在 .NET Framework 中,您可以把資料成員,就好像方法 (也就是其對應的委派 Invoke 方法)。 您必須預先定義宣告的 Managed 事件資料成員委派型別。 相反地,,如果尚未定義,或使用方法隱含定義對應的 Managed 委派。 例如,您可以宣告事件的值 (例如 OnClick 做為事件如下所示:
// Examples of managed events:
__event ClickEventHandler* OnClick; // data member as event
__event void OnClick(String* s); // method as event
當隱含宣告 Managed 事件,您可以指定 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;
}
};
範例:Managed 事件
// EventHandling_Managed_Event.cpp
// compile with: /clr:oldSyntax /c
using namespace System;
[event_source(managed)]
public __gc class CPSource {
public:
__event void MyEvent(Int16 nValue);
};
當屬性 (Attribute) 套用至事件時,您可以指定要套用屬性至產生的方法或產生的委派叫用方法。 預設 (event:) 是將屬性套用至事件。
// EventHandling_Managed_Event_2.cpp
// compile with: /clr:oldSyntax /c
using 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();
};