2012-02-17 5 views
0

나는 흥미로운 VB.NET을 사용하여 그래프를 작성하는 작업이 있습니다. 지금까지, GDI +와 예를 들어 제가 읽은 모든 것은 정말 이상합니다. 내가하고 싶은 모든2D 드로잉 : 버튼 - 다시 그리기 미스터리

1) 버튼을 1

2) 새로운 좌표를 얻기 위해 버튼을 1

3) 버튼을 클릭 한에서 숫자 라인을 그릴 버튼 2를 클릭을 클릭 약간의 좌표를 계산이다

4) 단추 2를 클릭하여 이전 줄과 새 줄을 그립니다.

5) 그래프를 지우려면 버튼 3을 클릭하십시오.

그래서 저는 panel1이라는 패널 위에 모든 것을 그릴 것을 결정했습니다. 단지 GraphicsHandler 일이 작동하여, 지금까지

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 

하지만, 매번 나는 창을 최소화하기 위해 시도하거나 : 나는 화면이라고 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 

다른 루틴이 새 줄을 그리면 이전 줄이 지워집니다. 어떤 종류의 영혼이 나에게 위의 단순한 1-5을하는 적절한 방법을 설명 할 수 있습니까? 예를 들어 버튼에서 drawlines()을 호출하려면 어떻게해야합니까?

답변

1

.NET은 WinForms 및 GDI +로 완전히 새로운 그래픽 조작 모델을 구현합니다. 당신의 오래된 VB6 기술은이 용감한 새로운 세상에서 당신을 잘 도와 줄 수 없습니다.

먼저 GraphicsHandler를 제거하십시오. 귀하의 모든 그림은 Panel의 Paint 이벤트를 통해 수행되어야합니다.

각 줄을 배열이나 List (Of Point) 형식으로 저장해야합니다. 그런 다음 Paint 이벤트가 호출 될 때마다 모든 행을 다시 그립니다. .NET 컨트롤은 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 
+0

나는 그것의 좀 두려워했다. 이 변경으로 인해 전체 프로그램 로직을 다시 배선해야합니다. 복잡한 기능과 짜잔과 같은 복잡한 그림을 추가하십시오, 여기 있습니다. 어쨌든 고마워. – Ivan

+0

@Ivan - 여기에 추가 정보가있는 링크가 있습니다 : http://bobpowell.net/picturebox.htm –

+0

글쎄, 다른 방법이 없다면, 나는 모든 기본적인 객체 지향 프로그래밍을 버리고 VB.NET 방식. 귀하의 답변에 감사드립니다. – Ivan