2D рисунок: кнопка - перерисовать загадку - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть интересная задача создания некоторых графиков с использованием VB.NET. Пока что все, что я читал о GDI + и электронной графике, все, что действительно странно. Все, что я хочу сделать, это

1) Рассчитать некоторые координаты нажатием кнопки 1

2) Нажмите кнопку 2, чтобы нарисовать линию с числами из кнопки 1

3) Нажмите кнопку 1, чтобы получить новые координаты

4) нажмите кнопку 2, чтобы нарисовать предыдущую линию и новую линию.

5) нажмите кнопку 3, чтобы очистить график.

Поэтому я решил нарисовать что-нибудь поверх панели, называемое panel1. У меня есть рутина, которая рисует на экране, называется 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 () с кнопки?

1 Ответ

1 голос
/ 17 февраля 2012

.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
...