Обработка событий в собственном C++

В собственном событии C++, настроенными помощью приемника событий для источника событий и событий event_source и event_receiver атрибуты, соответственно, указав type=native.Эти атрибуты позволяют классов, к которым они применяются, чтобы создать события и обработка событий в собственном формате, контекст non-модель COM.

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

В классе источника событий, воспользуйтесь __event ключевое слово для объявления метода для объявления метода как событие.Убедитесь, что объявления метода, но не укажите него; сделать выдаст ошибку компилятора, потому что компилятор определяет метод неявно, когда он выполняется в событие.Собственные события могут быть методами с нуля или более параметров.Возвращаемым типом может быть пустой или любой целочисленный тип.

Определение обработчиков событий

В классе приемника событий задаются обработчики событий, методы с подписями (возвращаемыми типами, вызов соглашения и аргументы), которые соответствуют событие, они обрабатывают.

Циклический обработчики событий на события

Также в классе приемника событий, используйте функцию внутреннеприсущую __hook связывание с обработчиками событий и событий __unhook разъединить события из обработчиков событий.Можно обработчик несколько событий к обработчику событий или нескольких обработчиков событий к событию.

События включения

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

ee2k0a7d.collapse_all(ru-ru,VS.110).gifСобственный код события C++

В следующем примере показано, как создать событие в собственном C++.Чтобы компилировать и запуск примера см. в разделе комментариев в коде.

Пример

ee2k0a7d.collapse_all(ru-ru,VS.110).gifКод

// evh_native.cpp
#include <stdio.h>

[event_source(native)]
class CSource {
public:
   __event void MyEvent(int nValue);
};

[event_receiver(native)]
class CReceiver {
public:
   void MyHandler1(int nValue) {
      printf_s("MyHandler1 was called with value %d.\n", nValue);
   }

   void MyHandler2(int nValue) {
      printf_s("MyHandler2 was called with value %d.\n", nValue);
   }

   void hookEvent(CSource* pSource) {
      __hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
      __hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
   }

   void unhookEvent(CSource* pSource) {
      __unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
      __unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
   }
};

int main() {
   CSource source;
   CReceiver receiver;

   receiver.hookEvent(&source);
   __raise source.MyEvent(123);
   receiver.unhookEvent(&source);
}

ee2k0a7d.collapse_all(ru-ru,VS.110).gifOutput

MyHandler2 was called with value 123.
MyHandler1 was called with value 123.

См. также

Ссылки

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