国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++事件處理中__event與__raise關鍵字的用法講解

2020-01-26 14:44:15
字體:
來源:轉載
供稿:網友

__event
聲明事件。
語法

   __event    method-declarator   ;__event __interface interface-specifier;__event member-declarator;

備注
關鍵字 __event 可應用于方法聲明、接口聲明或數據成員聲明。但是,不能使用 __event 關鍵字限定嵌套類的成員。
根據您的事件源和接收器是本機 C++、COM 還是托管 (.NET Framework),您可使用下列構造作為事件:

2016126151821045.png (426×192)

在事件接收器中使用 __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}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临江市| 政和县| 彭水| 开封县| 加查县| 乌恰县| 柳江县| 崇仁县| 固始县| 北票市| 杭州市| 谢通门县| 资溪县| 兴仁县| 册亨县| 胶州市| 湖州市| 大洼县| 泾阳县| 汶上县| 丰台区| 谷城县| 周至县| 贡嘎县| 台江县| 金川县| 五峰| 西盟| 高雄市| 邮箱| 方山县| 定兴县| 昌吉市| 崇信县| 清新县| 盐山县| 海原县| 特克斯县| 海伦市| 华安县| 临邑县|