Event
Declara um evento.
__event method-declarator;
__event __interface interface-specifier;
__event member-declarator;
Comentários
A palavra-chave __event pode ser aplicado a uma declaração de método, a uma declaração de interface, ou a uma declaração de membro de dados.Em o entanto, você não pode usar a palavra-chave de __event para determinar um membro de uma classe aninhada.
Dependendo se sua fonte do evento e o receptor são nativo C++, COM, ou gerenciado (.NET Framework), você pode usar as seguintes compilações como eventos:
C++ Nativo |
COM |
Gerenciado (.NET Framework) |
---|---|---|
Método |
— |
Método |
— |
interface |
— |
— |
— |
membro de dados |
Use __hook em um receptor de evento para associar um método manipulador com um método de evento.Observe que depois de criar um evento com a palavra-chave de __event , todos os manipuladores de eventos enganchados associado ao evento serão chamados quando o evento é chamado.
Uma declaração de método de __event não pode ter uma definição; uma definição é gerada implicitamente, então o método de evento pode ser chamado como se fosse qualquer método comum.
Observação |
---|
Uma classe ou estrutura modelo não podem conter eventos. |
Eventos nativos
Os eventos são métodos nativos.o tipo de retorno é normalmente HRESULT ou void, mas pode ser qualquer tipo integral, incluindo enum.Quando um evento utiliza um tipo de retorno inteiro, uma condição de erro é definida quando um manipulador de eventos retorna um valor diferente de zero, em esse caso o evento que está sendo gerado chamará os outros representantes.
// Examples of native C++ events:
__event void OnDblClick();
__event HRESULT OnClick(int* b, char* s);
Consulte Tratamento de evento em C++ nativo para o código de exemplo.
Eventos COM
Os eventos COM são interfaces.Parâmetros de um método em uma interface da fonte de evento devem ser parâmetros de in (mas isso não é imposta rigorosa), como um parâmetro de out não é útil para que é chamado de musticasting.Um aviso do nível 1 será enviado se você usar um parâmetro de out .
o tipo de retorno é normalmente HRESULT ou void, mas pode ser qualquer tipo integral, incluindo enum.Quando um evento utiliza um tipo de retorno inteiro e retorna um manipulador de eventos de um valor diferente de zero, é uma condição de erro, em esse caso o evento que é gerado abortos chama outros representantes.Observe que o compilador irá marcar automaticamente uma interface da fonte de evento como origem em IDL gerado.
A palavra-chave de __interface é necessário sempre após __event para uma fonte de evento COM.
// Example of a COM event:
__event __interface IEvent1;
Consulte Tratamento de eventos em COM para o código de exemplo.
Eventos gerenciados
Para obter informações sobre eventos de codificação para a nova sintaxe, consulte evento (Visual C++).
Eventos gerenciados são membros ou métodos de dados.Quando usado com um evento, o tipo de retorno de um delegado deve ser compatível com CLS (common language specification).O tipo de retorno do manipulador de eventos deve corresponder ao tipo de retorno do delegado.Para obter mais informações sobre os representantes, consulte __delegate.Se um evento gerenciado é um membro de dados, seu tipo deve ser um ponteiro para um delegado.
Em o .NET Framework, você pode manipular um membro de dados como se fosse um método próprio (isto é, o método de Invoke do delegado correspondente).Você deve predefinir o tipo delegado para declarar um membro gerenciado de dados do evento.Por outro lado, um método gerenciado de evento implicitamente define o delegado gerenciados correspondentes se ainda não estiver definido.Por exemplo, você pode declarar um valor de evento como OnClick como um evento da seguinte maneira:
// Examples of managed events:
__event ClickEventHandler* OnClick; // data member as event
__event void OnClick(String* s); // method as event
A o declarar implicitamente um evento gerenciado, você pode especificar adicionar e remover acessadores que serão chamados quando os manipuladores de eventos são adicionados ou removidos.Você também pode definir chama o método que gera o evento () fora da classe.
Exemplo: eventos nativos
// EventHandling_Native_Event.cpp
// compile with: /c
[event_source(native)]
class CSource {
public:
__event void MyEvent(int nValue);
};
Exemplo: 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;
}
};
Exemplo: eventos gerenciados
// 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);
};
Para aplicar um atributo a um evento, você pode especificar que o atributo se aplica aos métodos gerados ou método invoke delegado gerado.A opção () éevent:aplique o atributo para o evento.
// 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();
};