我正在编写一个程序,可以在运行时创建和加载图片框。问题是它们不会显示或显示任何内容。不知道我做错了什么。我已经检查过,图像的完整路径是正确的。
Sub DrawScreen()
'Call g.DrawImage to draw whatever you want in here
Dim layers(Me.ListBox1.Items.Count) As PictureBox
For i = 0 To ListBox1.Items.Count - 1
'Create New Layer as picturebox
layers(i) = New PictureBox
layers(i).Parent = Me.picWatch
layers(i).BackColor = Color.Transparent
layers(i).Visible = True
Select Case ListBox1.Items(i)
Case "image"
'Debug.Print(ListofLayers(i).Full_Path)
layers(i).Image = Image.FromFile(ListofLayers(i).Full_Path)
layers(i).Top = ListofLayers(i).X
picWatch.Controls.Add(layers(i))
Case "shape"
'Dim g As Graphics
'g.DrawRectangle()
Case "text"
Dim g As Graphics = layers(i).CreateGraphics
g.DrawString(ListofLayers(i).Text, New Font("Arial", 12), Brushes.White, ListofLayers(i).X, ListofLayers(i).Y)
Case Else
Debug.Print(ListBox1.Items(i))
End Select
Next
Me.Refresh()
End Sub
答案 0 :(得分:2)
您永远不会将图片框添加到表单中。致电Me.Controls.Add()
:
Me.Controls.Add(layers(i))
正如LarsTech已经指出的那样:
你似乎有一个错字:
layers(i).Top = ListofLayers(i).X
X
是控件水平位置的坐标,与.Left
相同。
Y
是控件垂直位置的坐标,与.Top
相同。
使用CreateGraphics
是一个坏主意。对于初学者,当重绘控件时,您使用它绘制的内容将被删除。而且由于你没有处理它,你也会有内存泄漏。
为每个图片框订阅Paint
event,然后在那里进行所有绘图。
最后,请注意一点:VB.NET中的数组声明没有指定数组中有多少项,而是指定数组应该以什么索引结束。由于数组是从零开始的,所以:
Dim layers(Me.ListBox1.Items.Count) As PictureBox
......等于这个:
Dim layers(0 To Me.ListBox1.Items.Count) As PictureBox
因此,数组将包含ListBox1.Items.Count
加一个 ,因为括号内的内容仅指定了下限和/或上限。
要创建具有“正确”数量项目的数组,您应始终指定 减去 的尺寸:
Dim layers(Me.ListBox1.Items.Count - 1) As PictureBox