2014-04-09 22 views
2

我有一個「完美」的工作代碼,用於將部分屏幕放入方形PictureBox。
我有一個「完美」的工作代碼,用筆在畫框上繪圖。
我完全不明白,爲什麼我無法在畫框中的位圖上畫筆 - 它只能在灰色背景上繪製。
該解決方案(也是按谷歌)看似簡單,但任何嘗試從PictureBox.Image獲取gg圖形的方法都會導致(「創建表單時發生錯誤,詳情請參閱Exception.InnerException。錯誤是:Value不能爲空 參數名稱:image「和」使用'New'關鍵字創建對象的新實例...「)。從PictureBox獲取位圖 - 對象的新實例

我覺得麻煩的是在我定義了一個子外的位圖作爲私人的方式,但我不能找出正確的觀念......

Private bit As New System.Drawing.Bitmap(250, 250) 
Private gg As Graphics = Graphics.FromImage(Me.PictureBox1.Image) 
'   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
'   ^^^^^^^^^^ HERE IS THE PROBLEM ^^^^^^^^^^^^^^^^^^^^^^ 
'   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Private br As New Pen(Color.Red) 
Private dwn As Boolean 
Private lst As Point 
Private firstrun As Boolean = True 
Dim Tloustka As Integer = 10 
Dim Barva As Integer 

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown 
    'gg = Graphics.FromImage(Me.PictureBox1.Image) 
    dwn = True 
End Sub 


Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove 
    If dwn = True Then 
     Dim s As Integer 
     Dim xy As Point 
     Dim br2 As New SolidBrush(Color.FromName("White")) 
     s = Tloustka 
     br.Color = Color.FromName("White") 
     br.Width = Tloustka 
     xy.X = e.X 
     xy.Y = e.Y 
     If firstrun = True Then 
      lst = xy 
      firstrun = False 
     End If 
     gg.FillEllipse(br2, xy.X - CLng(s/2), xy.Y - CLng(s/2), s, s) 
     gg.DrawLine(br, lst, xy) 
     lst = xy 
     PictureBox1.Image = bit 
    End If 
End Sub 

etc. etc. etc. 
+0

刪除「位」。當你完成繪圖時,調用PictureBox1.Invalidate(),以便知道它需要重新繪製圖像。 –

回答

1

不要存放圖形對象。剛剛從位圖上創建它時,你需要畫的東西:

Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove 
    If dwn = True Then 
    Using g As Graphics = Graphics.FromImage(bit) 
     Dim s As Integer 
     Dim xy As Point 
     Using br2 As New SolidBrush(Color.FromName("White")) 
     s = Tloustka 
     br.Color = Color.FromName("White") 
     br.Width = Tloustka 
     xy.X = e.X 
     xy.Y = e.Y 
     If firstrun = True Then 
      lst = xy 
      firstrun = False 
     End If 
     g.FillEllipse(br2, xy.X - CLng(s/2), xy.Y - CLng(s/2), s, s) 
     g.DrawLine(br, lst, xy) 
     End Using 
    End Using 
    lst = xy 
    PictureBox1.Invalidate() 
    End If 
End Sub 

然後使用圖片框的Paint事件來顯示圖像:

Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint 
    e.Graphics.DrawImage(bit, Point.Empty) 
End Sub 

確保你處置您的圖形對象。

+0

謝謝,這是一個完美的答案,它完全解決了我的麻煩!祝你今天愉快! –

0

上面的所有代碼似乎有點太複雜。在我的情況下,最簡單的方法是做如下:

昏暗的BM作爲位圖 隨着PictureBox1 BM =新位圖(.WIDTH,.Height) PictureBox1.DrawToBitmap(BM,新的Rectangle(0,0。寬度,.Height)) 完隨着

... /打印/

bm.Dispose

PS代碼:任何控制可以得出位圖。