none
切換TabPage後,原先畫在Graphic的圓點不見了.. RRS feed

  • 問題

  • 請問各位學長:

    設若我有二個TabPage,在TabPage1上有一張PictureBox,我在PictureBox上畫上圓點;但是當我切換到TabPage2,然後在切換回TabPage1的時候,剛剛畫在PictureBox的圓點卻不見了。

     

    請問,我要下怎樣的語法才能保持住所畫的圓點,而不受切換TabPage影響。

    2007年5月20日 上午 05:22

解答

  • Hi,先畫到記憶體中的圖檔這方式應該會比較適合,你參考看看下面程式碼

    Code Snippet

       Dim G As Graphics
        Dim F As New Font("Arial", 12)
        Dim B As Bitmap

        Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
            G.DrawString("12345", F, Brushes.Red, 20, 20)
            PictureBox1.Image = B
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            B = New Bitmap(PictureBox1.Width, PictureBox1.Height)
            G = Graphics.FromImage(B)
        End Sub

     

     

    2007年5月20日 上午 09:44
    版主
  • 報告學長:

    我已經測試出來了...

    Btm.Dispose()

    Btm = image.Fromfile("c:\DefaultPhoto.jpg")
            Me.PictureBox.Image = Btm
            Gr = Graphics.FromImage(Btm)
      
         Btm.Save("c:\myphoto.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

    多加一行Dispose()就可以了

     

    感謝您的指導!

    2007年5月21日 上午 10:13

所有回覆

  • 謝謝bauann的指導。

    但是我的環境不是在Form上,而是希望在TabPage上的PictureBox內,MouseDown的時候點出一顆圓點,所以我的paint方法,應該要下在哪一個類別上?

     

    我現在是下在...Handles PictureBox.MouseDown  這邊,這樣我按下滑鼠的時候才能產生一個圓點。請指教!

    2007年5月20日 上午 07:22
  • Hi,先畫到記憶體中的圖檔這方式應該會比較適合,你參考看看下面程式碼

    Code Snippet

       Dim G As Graphics
        Dim F As New Font("Arial", 12)
        Dim B As Bitmap

        Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
            G.DrawString("12345", F, Brushes.Red, 20, 20)
            PictureBox1.Image = B
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            B = New Bitmap(PictureBox1.Width, PictureBox1.Height)
            G = Graphics.FromImage(B)
        End Sub

     

     

    2007年5月20日 上午 09:44
    版主
  • 謝謝Bauann的指教,如果我要將程式所畫的圓點都刪掉,回到原始圖片的話,語法該如何下ㄋ?

    我是做一個Button然後下B.Dispose();可是這種做法在存檔的時候,會出現錯誤訊息,請指教一下。謝謝您了。

    2007年5月20日 下午 12:18
  • Hi,

    如果你下Dispose會將整個資源都釋放掉,那麼就會沒有"B"這個東西的存在了,你應該是重新在去讀一次原始的圖檔就行了,例如說 B = Image.FromFile("C:\Mypic.jpg") 。

    2007年5月20日 下午 04:00
    版主
  • 謝謝學長指教,依照您交我的方法,確實都ok了,但是當我按下清除的Button之後,畫面會回到預設圖沒錯,但是若再一次的在PictureBox上畫圓點,卻是無法儲存了,下面是我的程式碼,請指教。

     

    Dim Gr As Graphics
    Dim Btm As Bitmap

     

     Private Sub VetSave_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Btm = New Bitmap(Me.PictureBox.Image)

        Gr = Graphics.FromImage(Btm)

    End Sub

     

    Private Sub Photo_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Photo.MouseDown

    dim px as integer = e.X
      dim py as integer = e.Y

    Gr.FillEllipse(Brushes.Black, px, py, 10, 10) '畫出圓點

    Btm.Save("c:\myphoyo.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
      Me.PictureBox.Image= Btm

    EndSub

     

    Private Sub btn_Erase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Erase.Click
            '清除圖檔,回復預設圖
            Btm = Image.FromFile("C:\Images\DefaultPhoto.jpg")
            Me.PictureBox.Image= Btm
            Btm.Save("C:\myphoto.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

    Me.PictureBox.Image= Btm
        End Sub

    2007年5月21日 上午 03:41
  • Hi,

    因為你的Gr是先前產生過來的,重新設定你的bitmap之後也要重新去設定你的Gr,這樣應該就可以了,你測試看看。

    2007年5月21日 上午 07:51
    版主
  • 回學長:

    還是不行ㄋ...,程式方面我改這樣

    '清除圖檔,回復預設圖
            Btm = image.Fromfile("c:\DefaultPhoto.jpg")
            Me.PictureBox.Image = Btm
            Gr = Graphics.FromImage(Btm)
      
         Btm.Save("c:\myphoto.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

    我重新設定Gr,還是沒法存檔,我有去看C:\,發現myphoto.jpg都只是閃一下,並沒有存圖,傷腦筋!

    2007年5月21日 上午 09:28
  • 報告學長:

    我已經測試出來了...

    Btm.Dispose()

    Btm = image.Fromfile("c:\DefaultPhoto.jpg")
            Me.PictureBox.Image = Btm
            Gr = Graphics.FromImage(Btm)
      
         Btm.Save("c:\myphoto.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

    多加一行Dispose()就可以了

     

    感謝您的指導!

    2007年5月21日 上午 10:13