none
[VB2005] 請問 如何保留 Panel_Paint 已繪部份 RRS feed

  • 問題

  • 程式碼如下:
     
    Public Class Form1
        Dim g As Graphics, i As Integer
        Dim x() = {40, 90, 110, 160, 75, 88, 120, 47, 25, 67, 104, 180, 99, 14, 63, 90, 90}
        Dim y() = {40, 120, 50, 70, 63, 14, 99, 180, 104, 67, 25, 47, 120, 88, 75, 90, 90}
        Dim penRed As New Pen(Color.Red, 1)
        Dim penBlue As New Pen(Color.Blue, 1)

        Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
            g = e.Graphics
            g.DrawLine(penRed, i * 10, x(i), i * 20, x(i + 1))
            g.DrawLine(penBlue, i * 10, y(i), i * 20, y(i + 1))
        End Sub

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Panel1.Refresh()
            i += 1
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer1.Enabled = True
        End Sub
    End Class
     
     
    我在 Timer1 將變數 i 每秒增加 1,希望藉此把陣列 x 和 y 的值繪至 Panel1 當中
    不過 Panel1.Refresh() 會把原先繪製的清掉重繪,若我想保留原先已繪部份,請問
    有什麼方法可以解決呢??
     
    thanks

    2009年3月8日 上午 10:13

解答

  • 把 e.graphics 的部份, 改為 new 一個 bitmap, 用 graphics.fromimage,
    然後畫到 bitmap 上, 再讓 panel.backgroundimage = 這個 bitmap

    或是不要用 refresh, 讓 g = panel1.creategraphics, 把 drawline 的部份改到 timer1_tick 裡去做

    前者可以保留畫面, 後者不行, 但都可以讓你的圖完整畫完
    • 已標示為解答 phoinikas 2009年3月9日 上午 03:29
    2009年3月8日 下午 01:15
  • HI,

    要保留之前繪製的內容, 也可以將繪製過的內容再重繪一次
    • 已標示為解答 phoinikas 2009年3月9日 上午 03:29
    2009年3月9日 上午 02:40

所有回覆

  • 把 e.graphics 的部份, 改為 new 一個 bitmap, 用 graphics.fromimage,
    然後畫到 bitmap 上, 再讓 panel.backgroundimage = 這個 bitmap

    或是不要用 refresh, 讓 g = panel1.creategraphics, 把 drawline 的部份改到 timer1_tick 裡去做

    前者可以保留畫面, 後者不行, 但都可以讓你的圖完整畫完
    • 已標示為解答 phoinikas 2009年3月9日 上午 03:29
    2009年3月8日 下午 01:15
  • HI,

    要保留之前繪製的內容, 也可以將繪製過的內容再重繪一次
    • 已標示為解答 phoinikas 2009年3月9日 上午 03:29
    2009年3月9日 上午 02:40
  • 感謝各位前輩的指引,我再試試。

    2009年3月9日 上午 03:18
  •  

    Public Class Form1
        Dim g As Graphics, i As Integer = 0
        Dim x() = {40, 90, 110, 160, 75, 88, 120, 47, 25, 67, 104, 180, 99, 14, 63, 90, 90}
        Dim y() = {40, 120, 50, 70, 63, 14, 99, 180, 104, 67, 25, 47, 120, 88, 75, 90, 90}
        Dim penRed As New Pen(Color.Red, 1)
        Dim penBlue As New Pen(Color.Blue, 1)


        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer1.Enabled = True
        End Sub

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            g = Panel1.CreateGraphics
            g.DrawLine(penRed, i * 10, x(i), i * 20, x(i + 1))
            g.DrawLine(penBlue, i * 10, y(i), i * 20, y(i + 1))

            i += 1

            If i > 10 Then
                i = 0
                Panel1.Refresh()
            End If

        End Sub

        Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
            Dim j As Integer
            For j = 0 To i
                e.Graphics.DrawLine(penRed, j * 10, x(j), j * 20, x(j + 1))
                e.Graphics.DrawLine(penBlue, j * 10, y(j), j * 20, y(j + 1))
            Next
            e.Dispose()
        End Sub
    End Class

    2009年3月13日 上午 07:13