共用方式為


__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();
};

請參閱

參考

C + + 關鍵字

事件處理

event_source

event_receiver

__hook

__unhook

__raise