Hallo,
also, ein Paint-Ereignis wird ausgelöst, wenn ein Bereich der Form neu gezeichnet werden muss. Das passiert entweder durch das Betriebssystem, wenn beispielsweise das Fenster minimiert war und der Anwender es dann wiederherstellt, oder durch das Programm selbst, wenn es etwas neu zeichnen will.
Wann ein Paint-Ereignis auftritt oder wie oft es auftritt, ist nicht vorhersehbar. Deswegen sollte es nur dazu dienen, tatsächlich was zu zeichnen, nicht aber, um programmtechnische Sachen wie das Ändern der Koordinaten eines Rechtecks, welches gezeichnet werden soll, auszuführen.
Das Me.Invalidate() im Timer sagt dem Betriebssystem, dass das Programm die Form neu zeichnen will. Das Betriebssystem entscheidet dann, ob es eine neue Paint-Nachricht an das Programm schickt. Wenn das Programmfenster beispielsweise minimiert ist, wäre es völlig unnötig, etwas neu zu zeichnen, da es sowieso nicht sichtbar ist. Deshalb wird in diesem Fall kein Paint-Ereignis ausgelöst, und das Rechteck bleibt deswegen stehen, da seine Koordinaten auch nicht mehr erhöht werden.
Um nun die Koordinaten des Rechtecks im Timer, statt im Paint-Ereignis zu ändern, müsstest du die "i"-Variable global (also als Objektvariable der Form) deklarieren, damit diese im Timer erhöht werden kann, und im Paint-Ereignis dazu benutzt werden kann, um das Rechteck zu zeichnen.
Basierend auf deinem letzten Code könnte das dann so aussehen (ich hab die Variable "i" durch "RechteckTimerTickcount" ersetzt):
Public Class Form1
Private Stift As New Pen(Color.Blue, 5)
Private Pinsel As New SolidBrush(Color.Red)
Private RechteckTimerTickcount As Integer = 0
Private Sub Form1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim Z As Graphics = e.Graphics
' Rechteck zeichnen mit der x-Koordinate "RechteckTimerTickcount"
Z.DrawRectangle(Stift, RechteckTimerTickcount + 50, 50, 200, 100)
Z.FillRectangle(Pinsel, RechteckTimerTickcount + 50, 50, 200, 100)
End Sub
Private Sub RechteckButton_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles RechteckButton.Click
RechteckTimer.Enabled = True
End Sub
Private Sub RechteckTimer_Tick(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles RechteckTimer.Tick
RechteckTimerTickcount += 1 ' X-Koordinate des Rechtecks erhöhen
Me.Invalidate() ' Neues Paint-Ereignis vom System anfordern
End Sub
End Class Allerdings gibt es auch, wie Manfred sagte, die Klasse Rectangle, die ein Rechteck darstellt. Man könnte statt einer reinen x-Koordinate dann auch eine Variable als Rectangle deklarieren und dieses im Timer verändern, sodass es dann später im Paint-Ereignis gezeichnet werden kann.
Beitrag wurde zuletzt am 24.02.11 um 14:07:27 editiert. |