共用方式為


在原生 C++ 中處理事件

在原生 C++ 的事件處理,您將建立事件來源和事件接收者使用 event_sourceevent_receiver 分別屬性,指定type=native。 這些屬性可讓它們套用到引發事件和處理事件,在原生、 非 COM 內容中的類別。

宣告事件

在 [事件來源類別中,使用 __event 關鍵字在方法宣告來宣告為事件的方法。 確定宣告方法,但不是會定義 ; 若要這麼做會產生編譯器錯誤,因為編譯器定義方法隱含轉成事件時。 原生事件可以是零個或多個參數的方法。 傳回的型別可以是虛值或任何整數類資料型別。

定義事件處理常式

在事件接收者類別中,您可以定義事件處理常式,以符合將處理事件的簽章 (傳回型別,呼叫慣例和引數) 的方法。

攔截到事件的事件處理常式

也在事件接收者類別中,您要使用內建的函式 __hook 事件與事件處理常式和 __unhook ,就從事件處理常式的事件。 您可以連結至事件處理常式的幾個事件或事件的數個事件處理常式。

引發事件

若要引發事件,只要呼叫宣告為事件的事件來源類別的方法。 如果有已處理常式攔截到事件,就會呼叫處理常式。

ee2k0a7d.collapse_all(zh-tw,VS.110).gif原生 C++ 的事件程式碼

下列範例會示範如何引發原生 C++ 中的事件。 若要編譯和執行範例,請參閱程式碼中的註解。

範例

ee2k0a7d.collapse_all(zh-tw,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(zh-tw,VS.110).gifOutput

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

請參閱

參考

事件處理