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

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

C++事件處理中__event與__raise關(guān)鍵字的用法講解

2020-05-23 14:08:58
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C++事件處理中__event與__raise關(guān)鍵字的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
 

__event
聲明事件。
語法

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

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

C++事件處理中__event與__raise關(guān)鍵字的用法講解

在事件接收器中使用 __hook 可將處理程序方法與事件方法關(guān)聯(lián)。請注意,使用 __event 關(guān)鍵字創(chuàng)建一個事件之后,將在調(diào)用此事件時調(diào)用后來掛鉤到它的所有事件處理程序。
__event 方法聲明不能具有定義;定義是隱式生成的,因此可將事件方法當做任何普通方法一樣調(diào)用。
System_CAPS_note注意
模板類或結(jié)構(gòu)不能包含事件。
本機事件
本機事件是方法。返回類型通常是 HRESULT 或 void,但可以是任何整型(包括 enum)。當事件使用整數(shù)返回類型時,如果事件處理程序返回非零值,則會定義錯誤條件,在這種情況下,引發(fā)的事件將調(diào)用其他委托。

// Examples of native C++ events:__event void OnDblClick();__event HRESULT OnClick(int* b, char* s);

有關(guān)代碼示例,請參閱本機 C++ 中的事件處理。
COM 事件
COM 事件是接口。事件源接口中的方法的參數(shù)應(yīng)為 in 參數(shù)(但這不是強制要求的),因為 out 參數(shù)在多播時無用。如果使用 out 參數(shù),則將發(fā)出 1 級警告。
返回類型通常是 HRESULT 或 void,但可以是任何整型(包括 enum)。當事件使用整數(shù)返回類型并且事件處理程序返回非零值時,這是錯誤情況,此時引發(fā)的事件將中止對其他委托的調(diào)用。請注意,編譯器會自動將一個事件源接口標記為生成的 IDL 中的源。
COM 事件源的 __event 之后始終需要 __interface 關(guān)鍵字。

// Example of a COM event:__event __interface IEvent1;

有關(guān)代碼示例,請參閱 COM 中的事件處理。
托管事件
有關(guān)新語法中的編碼事件的信息,請參閱event(C++ 組件擴展)。
托管事件是數(shù)據(jù)成員或方法。當與事件一起使用時,委托的返回類型必須符合公共語言規(guī)范。事件處理程序的返回類型必須與委托的返回類型匹配。有關(guān)委托的詳細信息,請參閱 __delegate。如果托管事件是數(shù)據(jù)成員,則其類型必須是指向委托的指針。
在 .NET Framework 中,您可以將數(shù)據(jù)成員視為方法本身(即,其對應(yīng)委托的 Invoke 方法)。您必須預(yù)定義用于聲明托管事件數(shù)據(jù)成員的委托類型。相反,如果尚未定義對應(yīng)的托管委托,則托管事件方法將隱式定義它。例如,您可以將事件值(如 OnClick)聲明為下面所示的事件:

// Examples of managed events:__event ClickEventHandler* OnClick; // data member as event__event void OnClick(String* s); // method as event

隱式聲明托管事件時,您可以指定添加或移除添加或移除事件處理程序時將調(diào)用的 add 和 remove 訪問器。您還可以定義從類外部調(diào)用(引發(fā))事件的方法。
示例:本機事件

// 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);};

將特性應(yīng)用于事件時,您可以指定特性應(yīng)用于生成的方法還是生成的委托的 Invoke 方法。默認值 (event:) 用于將特性應(yīng)用于事件。

// 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
強調(diào)一個事件的調(diào)用站點。

__raise method-declarator;

備注
在托管代碼中,事件只能從定義它的類中引發(fā)。
說明
模板類或結(jié)構(gòu)不能包含事件。
示例

 // 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}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 贞丰县| 博客| 河西区| 林口县| 呼玛县| 饶平县| 招远市| 治县。| 临夏市| 博湖县| 鄄城县| 紫云| 五大连池市| 六安市| 寿光市| 南木林县| 永济市| 江安县| 页游| 常熟市| 汉中市| 崇州市| 郧西县| 民乐县| 台北市| 平阴县| 静海县| 石泉县| 武威市| 江门市| 额济纳旗| 香港 | 界首市| 犍为县| 五河县| 兴海县| 尉犁县| 儋州市| 巴青县| 滦平县| 连城县|