我正在尝试创建一个事件,该事件在用户单击加载表单时创建的图片框时发生

时间:2019-07-11 16:39:38

标签: vb.net

我正在尝试创建一个事件,该事件在用户单击图片框时发生。图片框是变量,picHandTwo是5个元素的数组。它是在窗体加载中创建和实例化的。但是,该事件永远不会发生,并且其中的代码不会执行

我尝试创建一个可以在整个表单上运行的大型透明图片框,但是即使它是透明的,它也可以覆盖所有图像。

Private Sub picHandTwo_Click(sender As Object, e As EventArgs)
        Dim pt = New Point(Cursor.Position.X - Me.Left, Cursor.Position.Y - 
        Me.Top)
        If lblStart.Visible = False Then
            For i = 0 To UBound(picHandTwo)
                If pt.X > picHandTwo(i).Left And pt.X < picHandTwo(i).Left + 
                   picHandTwo(i).Image.Width And pt.Y > picHandTwo(i).Top 
               And pt.Y < picHandTwo(i).Top + picHandTwo(i).Image.Height 
               Then
                    cardMagnifier.Image = handOne(i).getPic()
                End If
            Next
        End If
   End Sub

该方法内的代码很好,并且会发生,但事件永远不会发生。怎么了?

2 个答案:

答案 0 :(得分:0)

要处理的事件,需要专门添加一个事件处理程序。这可以在Visual Studio或by code中的表单设计器中完成。像这样:

AddHandler event, AddressOf eventhandler

在这种情况下:

AddHandler picHandTwo.Click, AddressOf picHandTwo_Click

答案 1 :(得分:0)

一些建议

  1. 如果要处理Click事件而不是MouseDown,请将EventArgs强制转换为MouseEventArgs(实际上是相同的对象),因此您需要使用相对的鼠标e.Location中的指针位置(无需转换Cursor.Position
  2. sender投射到PictureBoxsender引用了生成事件的控件),因此您知道单击了哪个控件。然后,您可以直接访问其属性。
  3. 在创建新控件后立即添加处理程序,然后将其添加到另一个控件的Controls集合中。

在这里,我还将每个新的PictureBox添加到List(Of PictureBox) myPictureBoxes )中。这段代码中并不需要它,但看起来您有类似的东西: handOne 。根据需要修改代码。

Private myPictureBoxes As New List(Of PictureBox)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For x = 0 To 4
        Dim pbox = New PictureBox() With {
            .Size = New Size(80, 80),
            .Location = New Point(.Size.Width * x, 0),
            .Name = $"picHandTwo{x}"
        }
        AddHandler pbox.Click, AddressOf picHandTwo_Click
        myPictureBoxes.Add(pbox)
    Next
    For Each ctrl As Control In myPictureBoxes
        Me.Controls.Add(ctrl)
    Next
End Sub

Private Sub picHandTwo_Click(sender As Object, e As EventArgs)
    Dim pbox = DirectCast(sender, PictureBox)
    If pbox Is Nothing Then Return
    ' If the Click location is needed: 
    Dim mousePos = DirectCast(e, MouseEventArgs).Location
    cardMagnifier.Image = pbox.Image
End Sub