Поделиться через


__event

Объявление события.

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

Заметки

Ключевое слово __event можно применить к объявлению метода, объявление интерфейса или объявлению элемента данных.Однако нельзя использовать ключевое слово __event для обозначения элементов вложенного класса.

В зависимости от ваших источник события, а получатель собственного C++, COM или управляемый (платформа .NET Framework) можно использовать следующие конструкции, как события:

Собственный C++

COM

Управляемый (платформа .NET Framework)

Метод

метод

interface

элемент данных

Используйте __hook в приемник событий, чтобы связать метод с методом обработчика события.Обратите внимание, что после создания события с ключевым словом __event, будут Вызываются все далее обрезанные обработчики событий для этого события, когда событие вызываются.

Объявление метода __event не может иметь определение; определение неявно создается, поэтому метод события можно вызывать, если было любым обычным методом.

ПримечаниеПримечание

Класс-шаблон или структура не могут содержать события.

Собственные события

Собственные события методов.Возвращаемый тип обычно HRESULT или void, но может быть любым объединенным типом, включая enum.Если событие использует объединенный тип возвращаемого значения, то условие ошибки определяется, когда обработчик событий возвращает ненулевое значение в этом случае событие вызовет оказаться полезным другие делегаты.

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

См. раздел Обработка событий в собственном C++ образец кода.

События модели COM

События модели COM интерфейсы.Параметры методов в интерфейсе источника события должны быть параметрами in (не rigorously принужденным но это), поскольку параметр out бесполезен multicasting.Предупреждение уровня 1, будет выдано, если выбран параметр out.

Возвращаемый тип обычно HRESULT или void, но может быть любым объединенным типом, включая enum.Если событие использует объединенный тип возвращаемых данных и возвращать обработчика событий ненулевое значение, условие ошибки, в этом случае событие поднятыми прерываниями вызывает другие делегаты.Обратите внимание, что компилятор автоматически помечает интерфейс в качестве источника события источник в созданном IDL.

Ключевое слово __interface всегда должен быть после __event для источника события модели COM.

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

См. раздел Обработка событий в модели COM образец кода.

Управляемые события

Дополнительные сведения о событиях кода в новом синтаксисе см. в разделе событие (Visual C++).

Управляемые события элементы данных или методы.При использовании с событием, тип возвращаемого значения делегата должен иметь несовместимый со спецификация CLS.Возвращаемый тип обработчика событий должен соответствовать возвращаемому типу делегата.Дополнительные сведения о делегатах см. в разделе __delegate.Если управляемое событие элемент данных, то его тип должен быть указателем делегату.

В платформе .NET Framework можно подготовить к просмотру элемент данных, если он был методом самого (т е метод Invoke соответствующего делегата).Необходимо предопределить тип делегата для объявления управляемого элемента данных события.Напротив, управляемый метод событий неявно определяет соответствующие, управляемый делегат, если он еще не определен.Например, можно объявить значение события в OnClick как событие следующим образом:

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

Если неявное объявление управляемое событие можно указать добавление и удаление методов доступа, которые будут Вызываются при добавлены или удалены обработчики событий.Также можно определить метод, вызывающий события вне класса.

Пример: собственные события

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

См. также

Ссылки

Ключевые слова C++

Обработка событий

event_source

event_receiver

__hook

__unhook

__raise