4

我正在为我的视觉基础课程制作游戏。我有多个图片框,单击它们会分别显示隐藏的图像。游戏的重点是找到匹配的图片(很简单)。

在最简单的级别上,我有 16 个图片框。图片框的数量随着难度的增加而增加。

对于每个图片框,我目前有一个事件处理程序如下(默认由 Visual Studio 创建):

Private Sub pictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pictureBox1.Click

里面,我打算用这个来改变图片框中的图片,如下:

pictureBox1.Image = (My.Resources.picture_name)

我想知道是否有一种方法可以让一个 Sub 处理所有按钮单击,并更改适当的图片框,而不是使用 16 个单独的处理程序。例如:

Private Sub pictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
     Handles pictureBox1.Click, pictureBox2.Click, pictureBox3.Click, ... pictureBox16.Click

并执行以下操作:

' Change appropriate picture box

这是它的样子(现在):
在此处输入图像描述

4

4 回答 4

5

要找出点击了哪个 PictureBox,您只需查看 sender 变量。显然你必须将它从 Object 类型转换为 PictureBox 类型:

Dim ClickedBox As PictureBox

ClickedBox = CType(sender, PictureBox)
于 2012-11-10T15:53:46.120 回答
4

就我个人而言,我会做的是将您的通用 EventHandler 附加到您的 PictureBox,给每个 PictureBox 一个标签作为索引,除非您想对名称进行选择。然后你做这样的事情。

Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox1.Click, PictureBox2.Click, ...
    Dim pb As PictureBox = CType(sender, PictureBox)

    Select Case CInt(pb.Tag)
        Case 0
            pb.Image = My.Resources.PictureName1

        Case 1
            pb.Image = My.Resources.PictureName2

            ...
    End Select
End Sub
于 2012-11-10T15:57:01.690 回答
0

例如,遍历所有控件

    For Each ctr As Control In Me.Controls
        If TypeOf ctr Is PictureBox Then
            If ctr Is ActiveControl Then
                ' Do Something here
            End If
        End If
    Next
于 2014-03-24T23:59:03.503 回答
0

根据我的阅读,DirectCast 优于 CType

DirectCast 可以与“With/End With”结合使用,如下所示:

Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox1.Click, PictureBox2.Click, ...
    With DirectCast(sender, PictureBox)
        Select Case CInt(.Tag)
            Case 0
                .Image = My.Resources.PictureName1
            Case 1
                .Image = My.Resources.PictureName2
                ...
        End Select
    End With
End Sub

我也尝试了以下方法,但这会导致奇怪的问题(控件消失)。

Using cbMe as CheckBox = DirectCast(sender, CheckBox)
    cbMe.Checked = True
End Using
于 2013-04-19T18:31:57.223 回答