【问题标题】:Code to draw works in button click event but not in form load绘制代码在按钮单击事件中有效,但在表单加载中无效
【发布时间】:2016-04-19 21:28:07
【问题描述】:

为什么我可以在按钮下运行以下代码,但在表单加载下却不能运行?

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

【问题讨论】:

  • 您是否收到错误消息?发生什么了?您绘制的内容不会以这种方式持续存在:将某些内容拖过表单或最小化,它会消失
  • 如果有错误,您会遇到什么错误?它在哪里不起作用?
  • 您应该在表单的绘制事件中完成所有绘图。在表单加载时,表单仍在加载,因此即使在加载后会出现油漆,也会删除您绘制的所有内容
  • 你也应该开启 Option Strict
  • 当我尝试使用表单加载事件触发它时,它没有任何错误。

标签: vb.net buttonclick form-load


【解决方案1】:

CreateGraphics 几乎没有正确的绘制方法。这将绘制一些不持久的东西。当该区域无效时,例如最小化表单或将另一个表单/应用程序拖到该区域上,您的形状将消失。

您还应该打开Option Strict。代码中有许多类型错误。例如,没有采用DecimalRectangle 构造函数。这甚至不是非整数的正确类,但RectangleF 也不需要小数。


核心问题是表单显示在表单加载事件的末尾。因此,您的代码在表单可见之前正在运行/绘图并且没有显示任何内容。即使表单已经显示出来,如果用户最小化表单或在其上移动另一个窗口,您绘制的任何内容都不会保留。

' 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() 是您正在绘制到表单,还是@987654331 @ 如果您正在绘制控件。

教训是,现在每次需要重新绘制表单时,您的形状也会重新绘制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多