2016-03-29 10 views
0

Okay, also versuche ich ein Programm zu machen, das bei jedem Klicken (egal wo) ein zufälliger farbiger und großer Kreis erscheint, wo du zufällig geklickt hast. Die einzige Möglichkeit, eine Form hinzuzufügen, ist jedoch das Paint-Ereignis. hier ist der Code, den ich jetzt habe:Wie verwenden Sie das Paint-Ereignis mehr als einmal in einem Formular?

Private Sub Form1_Paint(ByVal Sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint 


    Using Brush1 As New SolidBrush(Color.Orange) 
      e.Graphics.FillEllipse(Brush1, MousePosition.X, MousePosition.Y, 100, 100) 
     End Using 

End Sub 

Ich brauche eine Zeile Code zu wissen, dass ich in einem Maus-Klick-Ereignisse verwenden, die dieses Unter werden erneut ausführen. Ich weiß, wie man die Größe ändert und es zufällig macht, ich weiß einfach nicht, wie man dieses Sub mehrere Male, genauer; Führen Sie dieses Sub nach jedem Mausklick einmal aus. Wenn jemand helfen kann, würde ich es schätzen!

+3

Die Farbe Ereignis ganz läuft oft ganz von selbst. um es zu zwingen, 'me.invalidate' oder' me.refresh' – Plutonix

+0

Da es jedes Mal die gleiche Sache malt und bestehen bleibt, scheint es sinnlos, es zu zwingen, neu zu streichen. – Plutonix

+0

Gibt es eine Möglichkeit, dass ich das, was ich versuche, ohne das Paint-Event machen kann? –

Antwort

0

Genau wie Plutonix erklärte, wird eine Aktualisierung durch den Aufruf der Invalidate Methode behandelt.

Die Sache, die Sie beachten müssen, ist, dass alles, was auf einer Oberfläche gemalt wird, nicht dauerhaft ist, so dass Sie den gesamten Bildschirm jedes Mal neu zeichnen müssen. Es gibt natürlich viele Möglichkeiten, wie dies für Leistungszwecke optimiert werden kann, da dieser Prozess extrem CPU-intensiv sein kann; speziell, da GDI + nicht hardwarebeschleunigt ist.

Also, was Sie tun müssen, ist:

  1. Nehmen Sie jeder Klick (x, y-Position) und speichern Sie es

  2. Da der Radius jedes Kreises zufällig ist, bestimmen den Radius, wenn der Benutzer das Formular klickt, dann speichern zusammen mit der x, y-Position des Klicks

  3. dann hat die Paint Ereignis erneut zeichnet jede gespeicherte Folge von Klicks (mit ihren jeweiligen Radien) und jeden Kreis wieder zeichnen über und über .

Hier ist eine Implementierung, die den Trick machen wird. Kopieren Sie einfach diesen Code in jede Klasse Formular zu testen:

Private Class Circle 
    Public ReadOnly Property Center As Point 
    Public ReadOnly Property Radius As Integer 

    Public Sub New(center As Point, radius As Integer) 
     Me.Center = center 
     Me.Radius = radius 
    End Sub 
End Class 

Private circles As New List(Of Circle) 

Private radiusRandomizer As New Random() 

Private Sub FormLoad(sender As Object, e As EventArgs) Handles MyBase.Load 
    Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True) ' Not really necessary in this app... 
    Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True) 
    Me.SetStyle(ControlStyles.ResizeRedraw, True) 
    Me.SetStyle(ControlStyles.UserPaint, True) 
End Sub 

Private Sub FormMouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick 
    circles.Add(New Circle(New Point(e.X, e.Y), radiusRandomizer.Next(10, 100))) 
    Me.Invalidate() 
End Sub 

Private Sub FormPaint(sender As Object, e As PaintEventArgs) Handles Me.Paint 
    Dim g As Graphics = e.Graphics 

    g.Clear(Color.Black) 

    Using p As New Pen(Color.White) 
     For Each c In circles 
      g.DrawEllipse(p, c.Center.X - c.Radius \ 2, c.Center.Y - c.Radius \ 2, c.Radius, c.Radius) 
     Next 
    End Using 
End Sub 

Hier ist, was Sie nach ein paar Klicks auf dem Formular bekommen enter image description here

+0

Sehr geschätzt! –