如何在C ++ / CLI中处理事件

时间:2013-04-03 02:57:34

标签: winforms c++-cli

有人可以帮我修复我的功能吗?我正在尝试创建一个事件处理程序,但我不知道我的代码有什么问题,所以这里是:

private: System::Void progressBar(System::Object^  sender, System::EventArgs^  e System::Windows::Forms::WebBrowserProgressChangedEventArgs) Handles WebBrowser->ProgressChanged
 {
     // code here....
 }

我希望有人可以帮助我,因为我已经浏览过网络和一些论坛,但我没有运气,我找不到一个很好的代码示例。

1 个答案:

答案 0 :(得分:0)

您当前的事件处理函数定义存在两个问题:

  1. 用于声明第二个参数的语法无效。你有这个:

    EventArgs^ e WebBrowserProgressChangedEventArgs
    

    e参数声明为EventArgs^类型,然后在其后添加了一个随机的其他类型(WebBrowserProgressChangedEventArgs)。这将导致编译器错误,因为编译器不知道该怎么做,因为它不属于那里。

    如果您希望e属于WebBrowserProgressChangedEventArgs类型,则需要将其移至开头并移除EventArgs

    请记住,WebBrowserProgressChangedEventArgsEventArgs的子类(您可以告诉它,因为它以相同的名称结尾,在WinForms中是一种常见的命名约定),所以EventArgs所拥有的所有内容都可以做,WebBrowserProgressChangedEventArgs也可以。编译器已经知道这一点,所以你不需要告诉它。

    参数e的正确声明是:

    WebBrowserProgressChangedEventArgs^ e
    
  2. 据我所知,Handles关键字(在事件处理程序方法定义之后添加)在VB.NET中仅存在 。所以以下内容无效:

    Handles WebBrowser->ProgressChanged
    

    在其他语言(如C ++ / CLI和C#)中,您需要通过代码手动连接事件处理程序。看起来像这样:

    obj->Event += gcnew EventHandler(this, Obj_Event);
    


  3. 因此,将所有内容放在一起,事件处理程序方法的正确签名是:

    Void progressBar(Object^ sender, WebBrowserProgressChangedEventArgs^ e)
    {
        // code goes here...
    }
    

    在其他地方,您需要将此事件处理程序方法连接到事件,如下所示:

    WebBrowser->ProgressChanged += gcnew WebBrowserProgressChangedEventArgs(this, progressBar);