如何在C++/CLI中为事件分配事件处理程序?

6

如何向“事件”/委托添加“事件”?语法是什么? 在C++/CLI和C#中是否相同?


我应该如何为事件分配一个事件处理程序?使用UI添加事件处理程序并检查生成的代码。 - Jaroslav Jandek
在C++中,您可以使用_hookevent和UNHookEvent,或者实现观察者模式。 - Shashi
@Jaroslav 我想要给一个已经存在的事件添加一个新的事件,而不是创建一个新的。 - lital maatuk
1
添加事件意味着创建新的事件。添加事件处理程序意味着订阅事件,因此当事件被触发时,您分配的处理程序方法将被执行。 - Jaroslav Jandek
3个回答

17

1:如果事件的基础委托是你自己定义的类成员(来自MSDN的示例):

delegate void Del(int, float);
ref class EventReceiver {
public:
    void Handler(int i , float f) {  }
};
myEventSource->MyEvent += gcnew Del(myEventReceiver, &EventReceiver::Handler);

2:如果底层委托是全局处理程序,并且具有.NET事件的标准签名(对象+事件参数)(来自DPD答案):

delegate void MyOwnEventHandler(Object^ sender, EventArgs^ e) { }  
myEventSource->MyEvent += gcnew EventHandler(MyOwnEventHandler);  

3:如果底层代理具有.NET事件的标准签名,并且事件处理程序是类方法:

ref class EventReceiver {
public:
   void Handler(Object^ sender, EventArgs^ e) {  }
};
myEventSource->MyEvent += gcnew EventHandler(myEventReceiver, &EventReceiver::Handler);

4:使用System::EventHandler泛型(它带有一个MyEventArgs参数args)作为基础委托:

ref class EventReceiver {
public:
   void Handler(Object^ sender, MyEventArgs^ e) {  }
};
myEventSource->MyEvent += gcnew EventHandler<MyEventArgs^>(this, &EventReceiver::DataReceived);

这应该是被接受的答案。它涵盖了所有的可能性。谢谢! - Ignacio Soler Garcia
+1 这个问题确实需要一个有用的答案,因为现在已经有人指出了“重复”。 - user645280

11

中,您可以使用 += 操作符来实现:

someObj.SomeEvent += new EventHandler(Blah_SomeEvent);

...

private void Blah_SomeEvent(object sender, EventArgs e)
{
}

一年多后的编辑

自从我发布这个答案以来已经过了很长时间,有人提醒我可能是错误的。我真的不知道为什么原始问题发布者把我的答案标记为正确的(也许他们正在寻找这个而不是的语法?现在谁知道呢).

无论如何,在中应该是这样的:

someObj->SomeEvent+= gcnew EventHandler(this, &Blah_SomeEvent);

哦,我发现简单问题的答案同样重要。这有助于下一个用户搜索相同的内容 :) - PostMan
没错,我们要避免冗余。但你忘了大多数 RTFM 用户在提问之前不会搜索哈哈 ;) - Matías Fidemraizer
如果我们看问题标题的话,这不是一个正确的答案(C++/CLI 不是 C#)。 - dacap
2
@dacap 也许你应该给这个问题点个踩。如果我错了,那么 OP 寻找的是 C# 语法,那么这个问题就被错误地提出了。谁知道为什么 OP 把我的答案选为正确答案。不管怎样,看起来 OP 觉得它很有用。 - Matías Fidemraizer

7

C++/CLI 的语法如下:

delegate void MyOwnEventHandler(Object^ sender, Eventargs^ e)
{

}

要注册参加活动:

objectPtr->MyEvent += gcnew EventHandler(MyOwnEventHandler);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接