2012-02-17 13 views
0

を再描画私はVB.NETを使用していくつかのグラフを行う興味深いタスクを持っています。これまでのところ、私がGDI +や芸術家について何かを読んできたことは、本当に奇妙なことです。私がやりたいすべては2D図面:ボタン - 謎

1)ボタン1

2をクリックして、いくつかの座標を計算)ボタン1

3から番号の線を引くために、ボタン2をクリックして)新しい座標を取得するには、ボタン1をクリックしてください

4)クリックボタン2は、前の行と新しい行を描画します。

5)ボタン3をクリックしてグラフを消去します。

だから私は、パネル1と呼ばれるパネルの上にeverthingを描くことにしました。私は、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イベントを介して行う必要があります。

フォームレベル(ポイント)配列またはリスト内の各ラインを記憶すべきです。次に、Paintイベントが呼び出されるたびに、すべての行を再度描画します。 .NETコントロールは、VB6コントロールとは異なり、1つのペイントイベントから次のペイントイベントへのグラフィカルな状態を覚えていません。

あなたがあなたの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