Mot clé __event

Déclare un événement.

Remarque

Les attributs d’événement en C++ natifs sont incompatibles avec la norme C++. Ils ne sont pas compilés lorsque vous spécifiez le /permissive- mode de conformité.

Syntaxe

__event member-function-declarator ;
__event __interface interface-specifier ;
__event data-member-declarator ;

Notes

Les mot clé __event spécifiques à Microsoft peuvent être appliquées à une déclaration de fonction membre, à une déclaration d’interface ou à une déclaration de membre de données. Toutefois, vous ne pouvez pas utiliser le __event mot clé pour qualifier un membre d’une classe imbriquée.

Selon que votre source et votre récepteur d'événements sont C++ natif, COM ou managé (.NET Framework), vous pouvez utiliser les constructions suivantes en tant qu'événements :

C++ natif COM Managé (.NET Framework)
fonction membre - method
- interface -
- - membre de données

Utilisez __hook dans un récepteur d’événements pour associer une fonction membre de gestionnaire à une fonction membre d’événement. Après avoir créé un événement avec l’mot clé __event , tous les gestionnaires d’événements reliés à cet événement sont ensuite appelés lorsque l’événement est appelé.

Une __event déclaration de fonction membre ne peut pas avoir de définition ; une définition est implicitement générée, de sorte que la fonction membre d’événement peut être appelée comme s’il s’agissait d’une fonction membre ordinaire.

Remarque

Une classe ou un struct modèle ne peut pas contenir d’événements.

Événements natifs

Les événements natifs sont des fonctions membres. Le type de retour est généralement HRESULT ou void, mais peut être n’importe quel type intégral, y compris un enum. Lorsqu’un événement utilise un type de retour intégral, une condition d’erreur est définie lorsqu’un gestionnaire d’événements retourne une valeur différente de zéro. Dans ce cas, l’événement déclenché appelle les autres délégués.

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

Consultez Gestion des événements en C++ natif pour obtenir un exemple de code.

Événements COM

Les événements COM sont des interfaces. Les paramètres d’une fonction membre dans une interface source d’événement doivent être dans des paramètres, mais il n’est pas rigoureusement appliqué. C’est parce qu’un paramètre out n’est pas utile lors de la multidiffusion. Un avertissement de niveau 1 est émis si vous utilisez un paramètre out .

Le type de retour est généralement HRESULT ou void, mais peut être n’importe quel type intégral, y compris enum. Lorsqu’un événement utilise un type de retour intégral et qu’un gestionnaire d’événements retourne une valeur différente de zéro, il s’agit d’une condition d’erreur. L’événement déclenché abandonne les appels aux autres délégués. Le compilateur marque automatiquement une interface source d’événement comme idL source généré.

La __interface mot clé est toujours requise après __event pour une source d’événement COM.

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

Consultez la gestion des événements dans COM pour obtenir un exemple de code.

Événements managés

Pour plus d’informations sur le codage d’événements dans la nouvelle syntaxe, consultez l’événement.

Les événements managés sont des membres de données ou des fonctions membres. Lorsqu’il est utilisé avec un événement, le type de retour d’un délégué doit être conforme à la spécification common language. Le type de retour du gestionnaire d'événements doit correspondre à celui du délégué. Pour plus d’informations sur les délégués, consultez Délégués et Événements. Si un événement managé est un membre de données, son type doit être un pointeur vers un délégué.

Dans .NET Framework, vous pouvez traiter un membre de données comme s'il s'agissait d'une méthode (autrement dit, la méthode Invoke de son délégué correspondant). Pour ce faire, prédéfinis le type de délégué pour déclarer un membre de données d’événement managé. En revanche, une méthode d’événement managé définit implicitement le délégué managé correspondant s’il n’est pas déjà défini. Par exemple, vous pouvez déclarer une valeur d'événement telle que OnClick comme événement de la manière suivante :

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

Lorsque vous déclarez implicitement un événement managé, vous pouvez spécifier add et remove accéder aux accesseurs qui sont appelés lorsque des gestionnaires d’événements sont ajoutés ou supprimés. Vous pouvez également définir la fonction membre qui appelle (déclenche) l’événement en dehors de la classe.

Exemple : événements natifs

// EventHandling_Native_Event.cpp
// compile with: /c
[event_source(native)]
class CSource {
public:
   __event void MyEvent(int nValue);
};

Exemple : événements 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;
   }
};

Voir aussi

Mots clés
Gestion des événements
event_source
event_receiver
__hook
__unhook
__raise