Обработка событий в собственном C++
В собственном событии C++, настроенными помощью приемника событий для источника событий и событий event_source и event_receiver атрибуты, соответственно, указав type=native.Эти атрибуты позволяют классов, к которым они применяются, чтобы создать события и обработка событий в собственном формате, контекст non-модель COM.
Объявление событий
В классе источника событий, воспользуйтесь __event ключевое слово для объявления метода для объявления метода как событие.Убедитесь, что объявления метода, но не укажите него; сделать выдаст ошибку компилятора, потому что компилятор определяет метод неявно, когда он выполняется в событие.Собственные события могут быть методами с нуля или более параметров.Возвращаемым типом может быть пустой или любой целочисленный тип.
Определение обработчиков событий
В классе приемника событий задаются обработчики событий, методы с подписями (возвращаемыми типами, вызов соглашения и аргументы), которые соответствуют событие, они обрабатывают.
Циклический обработчики событий на события
Также в классе приемника событий, используйте функцию внутреннеприсущую __hook связывание с обработчиками событий и событий __unhook разъединить события из обработчиков событий.Можно обработчик несколько событий к обработчику событий или нескольких обработчиков событий к событию.
События включения
Чтобы создать событие, просто вызовите метод объявлен как класс источника события в событии., Если обработчики были закреплены к событию, обработчики будут вызваны.
Собственный код события C++
В следующем примере показано, как создать событие в собственном C++.Чтобы компилировать и запуск примера см. в разделе комментариев в коде.
Пример
Код
// 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);
}
Output
MyHandler2 was called with value 123.
MyHandler1 was called with value 123.