4

VisualBasicコース用のゲームを作っています。複数の画像ボックスがあり、クリックすると非表示の画像が個別に表示されます。ゲームのポイントは、一致する写真を見つけることです(十分に単純です)。

最も簡単なレベルでは、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)

16個の個別のハンドラーを使用する代わりに、1つのサブですべてのボタンクリックを処理し、適切な画像ボックスを変更する方法があるかどうかを知りたいです。例えば:

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

私が読んだことによると、DirectCastはCTypeよりも優先されます

DirectCastは、次のように「With/EndWith」と組み合わせることができます。

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 に答える
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 に答える