2013-10-17 170 views
0

我在Visual Basic中爲一個類項目創建了一個hang子手遊戲,並且我創建了一個函數,當您在該單詞的適當位置猜出正確的字母時,繪製一個字符串。我的問題是,每當我做出新的猜測時,它會刪除舊的圖形並添加新的圖形。我需要一種方法來保存我繪製的圖形,有人知道嗎?在Me.Refresh上保留圖形

Dim newCharArray() As Char = wordArray(rndNumber).ToCharArray 
For i As Integer = 0 To (wordArray(rndNumber).Length - 1) Step 1 
    If TextBox1.Text = newCharArray(i) Then 
     correctLetter = newCharArray(i) 
     letterPos = i 
     Me.Refresh() 
    End If 
Next 

Dim drawFont As New Font("Microsoft YaHei UI", 16) 
Dim drawBrush As New SolidBrush(Color.Black) 
Dim drawString As [String] = CStr(correctLetter) 
Dim drawPoint As New PointF(x:=(x1 + 4) + (letterPos * 40), y:=363) 
e.Graphics.DrawString(drawString, drawFont, drawBrush, drawPoint) 

回答

0

問題是Paint方法負責每次從頭開始繪製整個內容。

我會保留一個所有正確的字符及其位置的列表,並在Paint方法中每次繪製它們。

或者你可以繪製每個字符爲Bitmap代替,然後只畫在Paint方法的位圖,這樣的事情:

Private canvas As Bitmap = New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height) 
... 

    Dim newCharArray() As Char = wordArray(rndNumber).ToCharArray 
    For i As Integer = 0 To (wordArray(rndNumber).Length - 1) Step 1 
     If TextBox1.Text = newCharArray(i) Then 
      correctLetter = newCharArray(i) 
      letterPos = i 
      Me.Refresh() 
     End If 
    Next 
... 

Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 

    Dim drawFont As New Font("Microsoft YaHei UI", 16) 
    Dim drawBrush As New SolidBrush(Color.Black) 
    Dim drawString As [String] = CStr(correctLetter) 
    Dim drawPoint As New PointF(x:=(x1 + 4) + (letterPos * 40), y:=363) 

    Using g As Graphics = Graphics.FromImage(Me.canvas) 
     g.DrawString(drawString, drawFont, drawBrush, drawPoint) 
    End Using 

    e.Graphics.DrawImage(Me.canvas, New Point(0, 0)) 
End Sub 
+0

你會如何維護所有正確的字符的列表?我無法對它進行硬編碼,因爲我無法知道我會猜測哪個單詞或多長時間。當我複製它時,位圖的東西不起作用,我真的不知道它是如何工作的,所以我不知道有什麼問題...... –

+1

將它們放入一個「Array」或「List」中,它是私有的。例如:'私人PrevChars作爲新集合(的字符)' – Steve

+0

史蒂夫能請你詳細說明嗎?我對此很新,而且我不明白集合是如何工作的,尤其不是我可以如何在繪畫事件中使用它。 –