C++事件处理中__event与__raise关键字的用法讲解
__event __event method-declarator ; __event __interface interface-specifier; __event member-declarator; 备注 在事件接收器中使用 __hook 可将处理程序方法与事件方法关联。请注意,使用 __event 关键字创建一个事件之后,将在调用此事件时调用后来挂钩到它的所有事件处理程序。 // Examples of native C++ events: __event void OnDblClick(); __event HRESULT OnClick(int* b,char* s); 有关代码示例,请参阅本机 C++ 中的事件处理。 // Example of a COM event: __event __interface IEvent1; 有关代码示例,请参阅 COM 中的事件处理。 // 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 /c using 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 /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(); };
__raise method-declarator; 备注 // EventHandlingRef_raise.cpp struct 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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |