绘制代码在按钮单击事件中有效,但在表单加载中无效
Code to draw works in button click event but not in form load
为什么我 运行 以下代码即使在按钮下也能完美无缺,但在表单加载下却不能?
For Each line As String In System.IO.File.ReadAllLines("c:\pos.xml")
If line.Contains("<POS>") = True Then
Dim tagless As String = StripTags(line)
Dim parts As String() = tagless.Split(New Char() {","})
Dim XVAL As Decimal = parts(0)
Dim YVAL As Decimal = parts(1)
'paint markers...
Dim myBrush As New SolidBrush(Color.FromArgb(128, Color.Red))
Dim formGraphics As System.Drawing.Graphics
formGraphics = Me.PictureBox1.CreateGraphics()
formGraphics.FillEllipse(myBrush, New Rectangle(XVAL - 35, YVAL - 35, 70, 70))
myBrush.Dispose()
formGraphics.Dispose()
End If
Next
这里是 striptag 函数,如果需要...
Function StripTags(ByVal html As String) As String
' Remove HTML tags.
Return Regex.Replace(html, "<.*?>", "")
End Function
CreateGraphics
几乎没有正确的绘画方式。这将绘制不持久的东西。当该区域无效时,例如表单最小化或另一个 form/app 被拖过它,您的形状将消失。
您还应该打开 Option Strict
。代码中有许多类型错误。例如,没有 Rectangle
构造函数接受 Decimal
。对于非整数,这甚至不是正确的 Class,但是 RectangleF
也不采用小数。
核心问题是表单显示在表单加载事件的末尾。因此,您的代码是 running/drawing 在表单可见且未显示任何内容之前。即使表单 已经 显示,如果用户最小化表单或在其上移动另一个 window,则您绘制的任何内容都不会保留。
' form level list to store the data
Private XY As New List(Of PointF) ' pts
然后在表单加载事件中,读取数据并添加到列表中
For Each line As String In System.IO.File.ReadAllLines("...")
If line.Contains("<POS>") = True Then
Dim tagless As String = StripTags(line)
' c required under Option Strict
Dim parts As String() = tagless.Split(New Char() {","c})
' convert values to single. create a PointF
Dim ptF As New PointF(Convert.ToSingle(parts(0)), Convert.ToSingle(parts(1)))
' add to list
XY.Add(ptF)
End If
Next
接下来发生的事情应该是显示窗体和调用绘制事件。 Paint Event中使用的数据:
Dim rectF As RectangleF
Using myB As New SolidBrush(Color.FromArgb(128, Color.Red))
For Each ptF As PointF In XY
rectF = New RectangleF(ptF.X - 35, ptF.Y - 35,
70, 70)
e.Graphics.FillEllipse(myB, rectF)
Next
End Using
如果你有其他代码来添加点数据,比如按钮点击,在你添加、更改或删除数据后,使用Invalidate
强制重绘:Me.Invaludate()
是你正在绘制到表单,或者 PictureBox1.Invalidate()
如果您正在绘制控件。
教训是,现在每次需要重新绘制表单时,您的形状也会重新绘制。
为什么我 运行 以下代码即使在按钮下也能完美无缺,但在表单加载下却不能?
For Each line As String In System.IO.File.ReadAllLines("c:\pos.xml")
If line.Contains("<POS>") = True Then
Dim tagless As String = StripTags(line)
Dim parts As String() = tagless.Split(New Char() {","})
Dim XVAL As Decimal = parts(0)
Dim YVAL As Decimal = parts(1)
'paint markers...
Dim myBrush As New SolidBrush(Color.FromArgb(128, Color.Red))
Dim formGraphics As System.Drawing.Graphics
formGraphics = Me.PictureBox1.CreateGraphics()
formGraphics.FillEllipse(myBrush, New Rectangle(XVAL - 35, YVAL - 35, 70, 70))
myBrush.Dispose()
formGraphics.Dispose()
End If
Next
这里是 striptag 函数,如果需要...
Function StripTags(ByVal html As String) As String
' Remove HTML tags.
Return Regex.Replace(html, "<.*?>", "")
End Function
CreateGraphics
几乎没有正确的绘画方式。这将绘制不持久的东西。当该区域无效时,例如表单最小化或另一个 form/app 被拖过它,您的形状将消失。
您还应该打开 Option Strict
。代码中有许多类型错误。例如,没有 Rectangle
构造函数接受 Decimal
。对于非整数,这甚至不是正确的 Class,但是 RectangleF
也不采用小数。
核心问题是表单显示在表单加载事件的末尾。因此,您的代码是 running/drawing 在表单可见且未显示任何内容之前。即使表单 已经 显示,如果用户最小化表单或在其上移动另一个 window,则您绘制的任何内容都不会保留。
' form level list to store the data
Private XY As New List(Of PointF) ' pts
然后在表单加载事件中,读取数据并添加到列表中
For Each line As String In System.IO.File.ReadAllLines("...")
If line.Contains("<POS>") = True Then
Dim tagless As String = StripTags(line)
' c required under Option Strict
Dim parts As String() = tagless.Split(New Char() {","c})
' convert values to single. create a PointF
Dim ptF As New PointF(Convert.ToSingle(parts(0)), Convert.ToSingle(parts(1)))
' add to list
XY.Add(ptF)
End If
Next
接下来发生的事情应该是显示窗体和调用绘制事件。 Paint Event中使用的数据:
Dim rectF As RectangleF
Using myB As New SolidBrush(Color.FromArgb(128, Color.Red))
For Each ptF As PointF In XY
rectF = New RectangleF(ptF.X - 35, ptF.Y - 35,
70, 70)
e.Graphics.FillEllipse(myB, rectF)
Next
End Using
如果你有其他代码来添加点数据,比如按钮点击,在你添加、更改或删除数据后,使用Invalidate
强制重绘:Me.Invaludate()
是你正在绘制到表单,或者 PictureBox1.Invalidate()
如果您正在绘制控件。
教训是,现在每次需要重新绘制表单时,您的形状也会重新绘制。