如何以运行时创建的PictureBox为目标?VB.NET

如何以运行时创建的PictureBox为目标?VB.NET,vb.net,runtime,minesweeper,Vb.net,Runtime,Minesweeper,所以基本上,我已经成功地将网格中的某些图片框随机化,以包含地雷,并显示地雷,出于测试目的,这些地雷目前正在显示。你认为我需要做什么才能说: 如果你点击这个框,我的=1(有一个地雷),那么你输了 否则,继续前进 很简单,但是我想把它应用到所有的盒子上,不管网格有多大。(分区*分区Y) 我得到的最远的结果是,当单击任何一个MsgBox()时,都会弹出一个MsgBox() 这些都是在运行时创建的。这是我的密码 Public Class Form1 Inherits System.Windows.For

所以基本上,我已经成功地将网格中的某些图片框随机化,以包含地雷,并显示地雷,出于测试目的,这些地雷目前正在显示。你认为我需要做什么才能说:

如果你点击这个框,我的=1(有一个地雷),那么你输了
否则,继续前进

很简单,但是我想把它应用到所有的盒子上,不管网格有多大。(分区*分区Y)

我得到的最远的结果是,当单击任何一个MsgBox()时,都会弹出一个MsgBox()

这些都是在运行时创建的。这是我的密码

Public Class Form1
Inherits System.Windows.Forms.Form

Dim images(8) As Image 'declares image array

Dim zonesY As Integer = 10
Dim zonesX As Integer = 10

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

            pbxNewZone = New PictureBox

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

            pbxNewZone.Name = y & ", " & x
            If blockStatus < (allZones / 10) Then
                pbxNewZone.Tag = True
                If pbxNewZone.Tag = True Then
                    pbxNewZone.Image = images(8)
                End If
            Else
                pbxNewZone.Tag = False
                If pbxNewZone.Tag = False 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

End Sub

Private Sub pbxNewZoneClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)

    Dim pb As PictureBox = DirectCast(sender, PictureBox)
    Dim pbTag As Boolean = DirectCast(sender, Boolean)

        If pb.Tag = True Then
            pb.Image = images(7) 'Hit Image
        Else
            pb.Image = images(6) 'Clear Image
        End If

    MsgBox(pb.Tag)

End Sub
End Class
公共类表单1
继承System.Windows.Forms.Form
将图像(8)作为图像“声明图像数组”
尺寸分区为整数=10
整数=10时的尺寸
作为对象的暗淡家伙
Dim pbxNewZone As PictureBox=DirectCast(Guy,PictureBox)'将pbxNewZone声明为PictureBox变量
作为新随机变量的Dim生成器
Public Sub Form1_Load(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理MyBase.Load
图像(0)=Image.FromFile(“blank.png”)
图像(1)=Image.FromFile(“1.png”)
图像(2)=Image.FromFile(“2.png”)
图像(3)=Image.FromFile(“3.png”)
图像(4)=Image.FromFile(“4.png”)
图像(5)=Image.FromFile(“5.png”)
图像(6)=Image.FromFile(“clear.png”)
图像(7)=Image.FromFile(“hit.png”)
images(8)=Image.FromFile(“mine.png”)
Dim x As Integer'将x声明为整数变量
Dim y As Integer'将y声明为整数变量
Me.SuspendLayout()'暂停布局的创建
For y=1 To zonesY'启动For循环(1 To zonesY循环数)
For x=1到zonesX'启动For循环(1到zonesX循环数)
Dim zonesize1作为整数
Dim zonesize2作为整数
pbxNewZone=新图片盒
将块状态设置为整数
将所有区域设置为整数
所有区域=区域ESX*区域Y
blockStatus=generator.Next(0,所有区域)
pbxNewZone.Name=y&“,”&x
如果区块状态<(所有区域/10),则
pbxNewZone.Tag=True
如果pbxNewZone.Tag=True,则
pbxNewZone.Image=images(8)
如果结束
其他的
pbxNewZone.Tag=False
如果pbxNewZone.Tag=False,则
pbxNewZone.Image=images(0)
如果结束
如果结束
pbxNewZone.Height=16
pbxNewZone.Width=16
pbxNewZone.Tag=0
zonesize1=pbxNewZone.Height'列出了表单上的所有框。
zonesize2=pbxNewZone.Width
pbxNewZone.Left=((x-1)*分区1+15)
pbxNewZone.Top=((y-1)*分区2+15)
Me.Controls.Add(pbxNewZone)
'将此控件连接到适当的事件处理程序
AddHandler pbxNewZone。单击,pbxNewZone的地址已选中
下一个
下一个
Me.Height=(pbxNewZone.Height*zonesY+63)“设置fmmGame的高度
Me.Width=(pbxNewZone.Width*zonex+40)设置frmGame的宽度
端接头
私有子pbxNewZoneClicked(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)
Dim pb作为PictureBox=DirectCast(发送方,PictureBox)
Dim pbTag作为布尔值=DirectCast(发送方,布尔值)
如果pb.Tag=True,则
pb.Image=图像(7)“命中图像”
其他的
pb.图像=图像(6)“清晰图像”
如果结束
MsgBox(pb.Tag)
端接头
末级

除非我遗漏了什么,否则请将minePictureBox1.Tag设置为true,然后在click事件中检查它。或者你可以把它设为1或者其他什么。标签是一个对象


这就是你要找的吗?只是想知道这是不是地雷

一个快速的方法是使用
图片盒的
标记
元素来跟踪是否有地雷(或您的任何其他情况)

然后,通过将
pbxNewZoneClicked
方法的
sender
参数强制转换回
PictureBox
来访问
标记
属性:

Dim pb As PictureBox = DirectCast(sender, PictureBox)
If (pb.Tag = 1) Then
    'change game accordingly
End If

我认为整个网格的一个面板比每个单元的一个图片盒更容易管理,资源消耗更少

但对于您的点击问题:

Private Sub pbxNewZoneClicked(ByVal sender As Object, ByVal e As EventArgs)
  With DirectCast(sender, PictureBox)
    MsgBox(.Name)
  End With
End Sub

知道了。现在我让它检查tag=1或0,它随机分配矿山图像,但代码中的位置较低,正如您所建议的,我让它在点击一个框时检查tag。当我说如果pb.Tag=1它什么也不做,当我有ElseIf pb.Tag=2它什么也不做(对于=真/假也是如此)。我只会在使用其他图像时得到结果,即使在这种情况下,我也只能将其更改为一个图像,而它无法识别地雷或清晰图像。因此我得出结论,它并没有从循环中提取.Tag元素。如何将.Tag=1/2(真/假)从循环中吐出,并放入pb的Click事件中?循环:对于y=1到zonesY“启动一个for循环并为x=1到zonesX创建网格(1到zonesY循环数)启动一个for循环(1到zonesX循环数)I MsgBox(pb.Tag)”d,它总是返回0。在我看来,DirectCast是一个从公共子表单加载到私有子pbxNewZoneClicked的门户。我是否需要通过该门/入口传递pbxNewZone.Tag?没有入口,它是事件驱动的,因此每次单击该框时都会引发
pbxNewZoneClicked
事件。无论单击哪一个框,都会作为
发送者
隐式发送到该方法中,但您必须将其转换回要访问成员和方法的对象类型。在
Load
方法中,在循环中为每个框分配一个标记。并根据其是真是假(随机),将mine.png分配给Picturebox。如果我使用MsgBox(pbxNewZone.Tag),它会显示True或False。但是,如果在DirectCast之后输入MsgBox(pb.Tag),它总是发送0。
Private Sub pbxNewZoneClicked(ByVal sender As Object, ByVal e As EventArgs)
  With DirectCast(sender, PictureBox)
    MsgBox(.Name)
  End With
End Sub