Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Declara un evento.
Nota:
Los atributos de evento en C++ nativo no son compatibles con C++estándar. No se compilan al especificar /permissive- el modo de conformidad.
Sintaxis
__eventmember-function-declarator;
__event__interfaceinterface-specifier;
__eventdata-member-declarator;
Observaciones
La palabra clave __event específica de Microsoft se puede aplicar a una declaración de función miembro, una declaración de interfaz o una declaración de miembro de datos. Sin embargo, no puede usar la __event palabra clave para calificar a un miembro de una clase anidada.
Dependiendo de si el origen y el receptor de eventos son nativos de C++, COM o administrados (.NET Framework), puede usar las siguientes construcciones como eventos:
| C++ nativo | COM | Administrado (.NET Framework) |
|---|---|---|
| función miembro | - | método |
| - | interfaz | - |
| - | - | miembro de datos |
Use __hook en un receptor de eventos para asociar una función miembro del controlador a una función miembro de evento. Después de crear un evento con la __event palabra clave , todos los controladores de eventos se enlazan a ese evento después de llamar al evento cuando se llama al evento.
Una __event declaración de función miembro no puede tener una definición; se genera implícitamente una definición, por lo que se puede llamar a la función miembro del evento como si fuera una función miembro normal.
Nota:
Una clase o estructura con plantilla no puede contener eventos.
Eventos nativos
Los eventos nativos son funciones miembro. El tipo de valor devuelto suele HRESULT ser o void, pero puede ser cualquier tipo entero, incluido un enum. Cuando un evento usa un tipo de valor devuelto entero, se define una condición de error cuando un controlador de eventos devuelve un valor distinto de cero. En este caso, el evento que se genera llama a los demás delegados.
// Examples of native C++ events:
__event void OnDblClick();
__event HRESULT OnClick(int* b, char* s);
Consulte Control de eventos en C++ nativo para obtener código de ejemplo.
Eventos COM
Los eventos COM son interfaces. Los parámetros de una función miembro de una interfaz de origen de eventos deben estar en parámetros, pero no se aplican rigurosamente. Se debe a que un parámetro out no es útil al realizar la multidifusión. Se emite una advertencia de nivel 1 si usa un parámetro out .
El tipo de valor devuelto suele HRESULT ser o void, pero puede ser cualquier tipo entero, incluido enum. Cuando un evento usa un tipo de valor devuelto entero y un controlador de eventos devuelve un valor distinto de cero, se trata de una condición de error. El evento que se genera anula las llamadas a los demás delegados. El compilador marca automáticamente una interfaz de origen de eventos como en source la IDL generada.
La __interface palabra clave siempre es necesaria después __event de para un origen de eventos COM.
// Example of a COM event:
__event __interface IEvent1;
Consulte Control de eventos en COM para obtener código de ejemplo.
Eventos administrados
Para obtener información sobre cómo codificar eventos en la nueva sintaxis, vea event.
Los eventos administrados son miembros de datos o funciones miembro. Cuando se usa con un evento, el tipo de valor devuelto de un delegado debe cumplir la especificación de Common Language. El tipo de valor devuelto del controlador de eventos debe coincidir con el tipo de valor devuelto del delegado. Para obtener más información sobre los delegados, vea Delegados y eventos. Si un evento administrado es un miembro de datos, su tipo debe ser un puntero a un delegado.
En .NET Framework, puede tratar un miembro de datos como si fuera un propio método (es decir, el Invoke método de su delegado correspondiente). Para ello, predefini el tipo de delegado para declarar un miembro de datos de eventos administrados. En cambio, un método de evento administrado define implícitamente el delegado administrado correspondiente si aún no está definido. Por ejemplo, puede declarar un valor de evento como OnClick un evento como el siguiente:
// Examples of managed events:
__event ClickEventHandler* OnClick; // data member as event
__event void OnClick(String* s); // method as event
Al declarar implícitamente un evento administrado, puede especificar add y remove descriptores de acceso a los que se llama cuando se agregan o quitan controladores de eventos. También puede definir la función miembro que llama a (genera) el evento desde fuera de la clase .
Ejemplo: Eventos nativos
// EventHandling_Native_Event.cpp
// compile with: /c
[event_source(native)]
class CSource {
public:
__event void MyEvent(int nValue);
};
Ejemplo: eventos 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;
}
};
Consulte también
Palabras clave
Control de eventos
event_source
event_receiver
__hook
__unhook
__raise