【问题标题】:2D drawing: the button - redraw mystery2D绘图:按钮 - 重绘之谜
【发布时间】:2012-02-22 02:46:09
【问题描述】:

我的有趣任务是使用 VB.NET 绘制一些图表。到目前为止,我一直在阅读的关于 GDI+ 和 e.graphics 的所有内容都非常奇怪。我想做的就是

1) 点击按钮 1 计算一些坐标

2) 点击按钮 2 用按钮 1 的数字画一条线

3) 点击按钮1获取新坐标

4) 单击按钮 2 绘制上一行和新行。

5) 单击按钮 3 清除图形。

所以我决定在一个名为 panel1 的 Panel 上绘制所有内容。我有一个在屏幕上绘制的例程,称为 drawlines,

Private Sub drawlines(ByVal g As Graphics, ByVal c As Color)
  Dim p As New Pen(c, 1)
  g.DrawLine(p, xStart, yStart, xEnd, yEnd)
  p.Dispose()
End Sub

和其他例程:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  'AddHandler Panel1.Paint, AddressOf DrawLine
  GraphicsHandler = Panel1.CreateGraphics
End Sub

Private Sub drawlines(ByVal g As Graphics, ByVal c As Color)
  Dim p As New Pen(c, 1)
  g.DrawLine(p, xStart, yStart, xEnd, yEnd)
  p.Dispose()
End Sub

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  'GraphicsHandler = Panel1.CreateGraphics
  GraphicsHandler.DrawLine(myPen, 10, 10, 200, 100)
End Sub

Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
  xStart = CInt(Math.Ceiling(Rnd() * 200))
  yStart = CInt(Math.Ceiling(Rnd() * 100))
  xEnd = CInt(Math.Ceiling(Rnd() * 200))
  yEnd = CInt(Math.Ceiling(Rnd() * 100))
  Me.Panel1.Invalidate()
End Sub

Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Panel1.Paint
  drawlines(e.Graphics, Color.Blue)
End Sub

Private Sub Button3_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button3.Click
  GraphicsHandler.Clear(Color.White)
End Sub

到目前为止,仅使用 GraphicsHandler 的东西是有效的,但是每次我尝试最小化窗口或绘制新行时,以前的行都会被删除。某个善良的灵魂可以向我解释完成上述简单 1-5 的正确方法吗?例如,如何从按钮调用 drawlines()?

【问题讨论】:

    标签: vb.net winforms vb6-migration


    【解决方案1】:

    .NET 使用 WinForms 和 GDI+ 实现了全新的图形操作模型。在这个美丽的新世界中,您的旧 VB6 技能将无法为您服务。

    所以从放弃 GraphicsHandler 开始。您的所有绘画都应通过面板的 Paint 事件完成。

    您应该将每一行存储在表单级别的数组或 List(Of Point) 中。然后每次调用 Paint 事件时,您都会再次绘制所有线条。 .NET 控件不会记住它们从一个 Paint 事件到下一个事件的图形状态,这与 VB6 控件不同。

    如果您需要在按钮单击事件结束时强制重绘,您可以调用 Panel.Invalidate()

    伪代码:

    Private myCoordinates As List(Of Point) = New List(Of Point)
    
    Sub Button_click(sender, e)
      '' Store new coordinate
      myCoordinates.Add(New Point(x, y))
      myCoordinates.Add(New Point(x, y))
      myPanel.Invalidate()
    End Sub
    
    
    Sub Panel_Paint(sender, e) Handles myPanel.Paint
      For tIndex As Int32 = 0 To myCoordinates.Count - 1 Step 2
        e.graphics.DrawLine(myCoordinate(tIndex), myCoordinates(tIndex+1))
      Next
    End Sub
    

    【讨论】:

    • 我有点害怕。仅仅因为这种变化,就不得不重新连接整个程序逻辑。添加一些复杂的绘图,比如复杂的函数,瞧,我们开始吧。还是谢谢。
    • @Ivan - 这是一个包含更多信息的链接:bobpowell.net/picturebox.htm
    • 好吧,如果没有其他办法,我将不得不放弃所有基本的面向对象编程并以 VB.NET 方式进行。谢谢你的回答。
    • 当我从 VB6 迁移过来时,我也在为新的图形绘制程序而苦苦挣扎。不过,一旦我开始了解它,它就会成为一个更强大的工具,并且同样易于使用。
    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多