Guten Abend.
Ich stehe vor einem kleinen Problem.
Die Reihenfolge, oder besser: die Prioritäten, die den Events
zugeordnet werden passt mir nicht ganz ins Konzept.
Folgendes Beispiel:
Wenn das ausgeführt wird (Me.DoubleBuffered auf True), dann werden ein paar grüne Rechtecke am unteren Rand gezeichnet und ein paar Linien von links oben zu den jeweilgen Punkten. Es werden auch zwei rote Linien horizontal und vertikal gezeichnet, um die Mausposition anzuzeigen.
Wenn man die Maus nun auf der Form bewegt und in Bewegung hält, dann friert alles ein, was in der Sub TimerTick passiert (nämlich einen Wert inkrementieren).
Das MouseMove Event "blockiert" sozusagen durch sein häufiges Auftreten das Tick Event des Timers.
Da stellt sich mir aber die Frage wie das sein kann.
Denn irgendwann ist der Intervall des Timers zu Ende und der Event wird ausgelöst und befindet sich in der "Warteschlange" (Ich glaube das hieß Message Queue).
Durch Me.Invalidate() in der Sub MeMouseMove wurde auch das Paint Event ausgelöst. Abhängig, ob das vor oder nach dem Tick passiert ist wird beim Verlassen der Sub MeMouseMove entweder das Paint Event, oder das Tick Event behandelt.
Das Problem ist allerdings: Es wird immer das Paint Event behandelt und dann sofort wieder ein neues MouseMove Event behandelt, ohne Acht auf das inzwischen schon lange eingetretene Tick Event zu geben.
Meine Frage: Lässt sich das irgendwie steuern?
Das Problem ist nämlich, dass die Animation weiterlaufen soll und gleichzeitig andere Dinge verschoben werden können sollen (... mögen müssen ^^).
Falls es sich nicht steuern lässt: wie lässt sich das Problem anders lösen?
Ich stehe vor einem kleinen Problem.
Die Reihenfolge, oder besser: die Prioritäten, die den Events
zugeordnet werden passt mir nicht ganz ins Konzept.
Folgendes Beispiel:
VB.NET-Quellcode
- Dim WithEvents TimerStuff As New Timer With {.Interval = 30, .Enabled = True}
- Dim PX As Integer = 0
- Dim PY As Integer = 0
- Dim X As Integer = 0
- Private Sub MeMouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseMove
- PX = e.X
- PY = e.Y
- Me.Invalidate()
- End Sub
- Private Sub TimerTick() Handles TimerStuff.Tick
- X += 1
- If X > Me.ClientRectangle.Width Then
- X = 0
- End If
- Me.Invalidate()
- End Sub
- Private Sub MePaint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
- e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
- 'Mausposition mit gekreuzten Linien darstellen
- e.Graphics.DrawLine(Pens.Red, PX, 0, PX, Me.ClientRectangle.Height)
- e.Graphics.DrawLine(Pens.Red, 0, PY, Me.ClientRectangle.Width, PY)
- 'Irgendwas aufwendiges zeichnen
- For i As Integer = 0 To Me.ClientRectangle.Width
- e.Graphics.DrawLine(Pens.Green, 0, 0, X + i, Me.ClientRectangle.Height)
- e.Graphics.FillRectangle(Brushes.Green, X + i, Me.ClientRectangle.Height - 20, 20, 20)
- Next
- End Sub
Wenn das ausgeführt wird (Me.DoubleBuffered auf True), dann werden ein paar grüne Rechtecke am unteren Rand gezeichnet und ein paar Linien von links oben zu den jeweilgen Punkten. Es werden auch zwei rote Linien horizontal und vertikal gezeichnet, um die Mausposition anzuzeigen.
Wenn man die Maus nun auf der Form bewegt und in Bewegung hält, dann friert alles ein, was in der Sub TimerTick passiert (nämlich einen Wert inkrementieren).
Das MouseMove Event "blockiert" sozusagen durch sein häufiges Auftreten das Tick Event des Timers.
Da stellt sich mir aber die Frage wie das sein kann.
Denn irgendwann ist der Intervall des Timers zu Ende und der Event wird ausgelöst und befindet sich in der "Warteschlange" (Ich glaube das hieß Message Queue).
Durch Me.Invalidate() in der Sub MeMouseMove wurde auch das Paint Event ausgelöst. Abhängig, ob das vor oder nach dem Tick passiert ist wird beim Verlassen der Sub MeMouseMove entweder das Paint Event, oder das Tick Event behandelt.
Das Problem ist allerdings: Es wird immer das Paint Event behandelt und dann sofort wieder ein neues MouseMove Event behandelt, ohne Acht auf das inzwischen schon lange eingetretene Tick Event zu geben.
Meine Frage: Lässt sich das irgendwie steuern?
Das Problem ist nämlich, dass die Animation weiterlaufen soll und gleichzeitig andere Dinge verschoben werden können sollen (... mögen müssen ^^).
Falls es sich nicht steuern lässt: wie lässt sich das Problem anders lösen?
"Luckily luh... luckily it wasn't poi-"
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils