我正在尝试创建一个事件,该事件在用户单击图片框时发生。图片框是变量,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
该方法内的代码很好,并且会发生,但事件永远不会发生。怎么了?
答案 0 :(得分:0)
要处理的事件,需要专门添加一个事件处理程序。这可以在Visual Studio或by code中的表单设计器中完成。像这样:
AddHandler event, AddressOf eventhandler
在这种情况下:
AddHandler picHandTwo.Click, AddressOf picHandTwo_Click
答案 1 :(得分:0)
一些建议
Click
事件而不是MouseDown
,请将EventArgs
强制转换为MouseEventArgs
(实际上是相同的对象),因此您需要使用相对的鼠标e.Location
中的指针位置(无需转换Cursor.Position
)sender
投射到PictureBox
(sender
引用了生成事件的控件),因此您知道单击了哪个控件。然后,您可以直接访问其属性。 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