2012-02-17 113 views
0

我有有趣任務使用VB.NET做一些圖。到目前爲止,我一直在讀的關於GDI +和e.graphics的一切都很奇怪。所有我想要做的就是二維繪圖:按鈕 - 重繪神祕

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

.NET使用WinForms和GDI +實現了一個全新的圖形操作模型。你的舊VB6技能在這個勇敢的新世界中將無法爲你服務。

所以從開始的GraphicsHandler開始。所有的繪畫都應該通過Panel的Paint事件完成。

您應該將每行存儲在數組或表單級別的List(Of Point)中。然後每次調用Paint事件時,都會再次繪製所有行。與VB6控件不同,.NET控件不會將其圖形狀態從一個Paint事件記錄到下一個。

如果您需要強制重繪在您的按鈕結束Click事件,你會打電話給你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 2012-02-18 22:14:49

+0

@Ivan - 這是一個鏈接,附加信息:http://bobpowell.net/picturebox.htm – 2012-02-20 14:59:02

+0

那麼,如果沒有其他的方法,我將不得不拋棄所有基本的面向對象編程,並在VB.NET的方式。感謝您的回答。 – Ivan 2012-02-21 17:56:57