0

所以基本上,我有 2 个 int 变量,x 和 yi 用于创建图片框网格。

这一切都是流动的,并且建立在运行时。

如果我的 = 2,我正在尝试专门更改单击时的图片框。

我不能专门更改一个,当我单击任何一个时,它都会更改所有这些。

请帮忙!!

这是我的代码:

  Public Class Form1
    Inherits System.Windows.Forms.Form

    Dim images(8) As Image 'declares image array

    Dim zonesY As Integer = 50
    Dim zonesX As Integer = 50

    Dim Guy As Object
    Dim pbxNewZone As PictureBox = DirectCast(Guy, PictureBox)  'declares pbxNewZone as a picturebox variable

    Dim generator As New Random

    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        images(0) = Image.FromFile("blank.png")
        images(1) = Image.FromFile("1.png")
        images(2) = Image.FromFile("2.png")
        images(3) = Image.FromFile("3.png")
        images(4) = Image.FromFile("4.png")
        images(5) = Image.FromFile("5.png")
        images(6) = Image.FromFile("clear.png")
        images(7) = Image.FromFile("hit.png")
        images(8) = Image.FromFile("mine.png")

        Dim x As Integer  'declares x as an integer variable
        Dim y As Integer  'declares y as an integer variable
        Me.SuspendLayout()  'suspends creation of layout

        For y = 1 To zonesY 'starts a For loop (1 to zonesY number of loops)
            For x = 1 To zonesX  'starts a For loop (1 to zonesX number of loops)
                Dim zonesize1 As Integer
                Dim zonesize2 As Integer
                Dim mine As Integer

                pbxNewZone = New PictureBox

                Dim blockStatus As Integer
                Dim allZones As Integer
                allZones = zonesX * zonesY
                blockStatus = generator.Next(0, allZones)

                pbxNewZone.Name = (zonesX * (y - 1)) + x
                If blockStatus < (allZones / 10) Then
                    mine = 1
                    If mine = 1 Then
                        pbxNewZone.Image = images(8)
                    End If
                Else
                    mine = 2
                    If mine = 2 Then
                        pbxNewZone.Image = images(0)
                    End If
                End If
                pbxNewZone.Height = 16
                pbxNewZone.Width = 16
                pbxNewZone.Tag = 0
                zonesize1 = pbxNewZone.Height 'sets out all of the boxes on the form.
                zonesize2 = pbxNewZone.Width
                pbxNewZone.Left = ((x - 1) * zonesize1 + 15)
                pbxNewZone.Top = ((y - 1) * zonesize2 + 15)
                Me.Controls.Add(pbxNewZone)
                '  Wire this control up to an appropriate event handler
                AddHandler pbxNewZone.Click, AddressOf pbxNewZoneClicked

            Next
        Next
        Me.Height = (pbxNewZone.Height * zonesY + 63)  'sets the height of fmmGame
        Me.Width = (pbxNewZone.Width * zonesX + 40)  'sets the width of frmGame

        checkBlank()

    End Sub

    Public Sub checkBlank()

    End Sub

    Private Sub pbxNewZoneClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
        ReDim x
        Do While y = 1 'starts a For loop (1 to zonesY number of loops)
            Do While x = 1  'starts a For loop (1 to zonesX number of loops)
                MsgBox("you have clicked " & x & ", " & y)
            Loop
        Loop
    End Sub

End Class
4

2 回答 2

4

您正在向所有 PictureBoxes 添加相同的处理程序,但未对单击的特定 PictureBox 执行任何操作(Sender 参数)。您可以使用名称或标签属性来确定如何处理单击。您可能希望扩展标准 PictureBox 以包含额外的参数,这将使这更容易 - 例如 x 和 y 属性。

顺便说一句,您可能需要考虑重构 form_load 以便它调用许多更离散的方法。

于 2011-10-17T15:53:20.773 回答
1

在 Click 事件中,sender将是被点击的对象,所以......

Dim pbx as PictureBox = DirectCast(sender,PictureBox)

...将为您提供单击的 PictureBox 的参考(as pbx) - 然后您可以使用它做您需要做的事情。

为方便起见,您可能希望通过检查来检查给定 PictureBox 的状态pbx.Image- 因为您没有 PictureBox 的任何自定义属性。

于 2011-10-17T15:48:17.143 回答