2013-10-17 48 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

史蒂夫能请你详细说明吗?我对此很新,而且我不明白集合是如何工作的,尤其不是我可以如何在绘画事件中使用它。 –