【问题标题】:How do I assign an event handler to an event in C++/CLI?如何将事件处理程序分配给 C++/CLI 中的事件?
【发布时间】:2011-02-09 07:24:32
【问题描述】:

如何将“事件”添加到“事件”/代表?语法是什么? 在 C++/CLI 和 C# 中是否相同?

【问题讨论】:

  • 应该是“我如何(注册)为事件分配事件处理程序”?使用 UI 添加事件处理程序并检查生成的代码。
  • 在 c++ 中你可以使用 _hookevent 和 UNHookEvent 或者使用实现观察者模式
  • @Jaroslav 我想将一个事件添加到一个已经存在的事件中。不要创建一个新的。
  • 添加事件意味着创建新事件。添加事件处理程序意味着订阅事件,所以当一个事件被触发时,你分配的处理程序方法就会被执行。

标签: c# .net events c++-cli event-handling


【解决方案1】:

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 generic(接受 MyEventArgs args 参数)作为底层委托:

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

【讨论】:

  • 这应该是公认的答案。它涵盖了所有的可能性。谢谢!
  • +1 这个问题真的需要一个有用的答案,因为它现在被“骗子”指着。
【解决方案2】:

中,您可以使用+= 运算符:

someObj.SomeEvent += new EventHandler(Blah_SomeEvent);

...

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

一年多以后的编辑

我已经很久没有发布这个答案了,有人注意到我可能是错的。我真的不知道为什么 OP 将我的答案标记为正确的答案(也许 OP 正在寻找这个而不是 语法?现在谁知道)

无论如何, 会是:

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

【讨论】:

  • 哦,我发现简单问题的答案很重要。当下一个用户搜索相同的东西时提供帮助:)
  • 对,我们避免冗余。但是您忘记了大多数 RTFM 用户在询问之前不会搜索哈哈 ;)
  • 如果我们看问题标题,这不是一个正确的答案(C++/CLI 不是 C#)。
  • @dacap 也许你应该否决这个问题。如果我错了 OP 寻找 C# 语法,那应该是错误地问了这个问题。谁知道为什么 OP 将我的答案检查为正确答案。无论如何,OP似乎发现它很有用。
【解决方案3】:

C++/CLI 的语法是:

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

}

为活动注册:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多