Entwickler-Ecke

WinForms - Mouse Button Up Event


DummyScript - Fr 06.08.10 17:24
Titel: Mouse Button Up Event
Hi!

Ich versuche einen Button zu erstellen, bei dem beim Klick ein Event ausgeführt wird (funktioniert) bzw. beim Loslassen der Maustaste (funktioniert nicht). Für das Loslassen habe ich das MouseUp Event verwendet.

Das Problem, das Click Event und das MouseUP Event werden kurz nacheinander aufgerufen (~10 ms versetzt) obwohl die Maustaste viel länger gedrückt wird. Jetzt habe ich 2 Fragen:
1) Habe ich das richtige Event in Verwendung?
2) Kann es sein, dass durch aufrufen von System.Threading.Thread.Sleep() automatisch der Button losgelassen wird? Bzw. gibt es ein Event bei dem das nicht so ist? Der Fehler wäre einfach zu beheben, einfach das Fenster in einem eigenen Thread starten....

Danke für eure Hilfe!


Ralf Jansen - Fr 06.08.10 17:51

Bitte kurz erklären wofür du das brauchst dann kann man deine Probleme glaube ich besser verstehen.

zu 1) Vermutlich brauchst du die beiden, vermutlich aber nicht nur. Kommt drauf an was du vor hast. Z.B nur weil du einen Click von deinem Button bekommen hast muss du noch lange keinen folgenden MouseUp bekommen. Man könnte ja einfach bei gedrückter Mousetaste das focusierte Control wechseln(per TAB). Dann wirft ein anderes Control den MouseUp.

zu 2) Sleep ist vermutlich unschuldig. Wobei ich nicht weiß wie du das einsetzt uns warum. Und was ist loslassen eines Buttons? Bist du Drag&Drop für Controls am simulieren?


DummyScript - Fr 06.08.10 18:51

Ich habe 4 Buttons die ein Fadenkreuz darstellen. Durch drücken und halten einer der Buttons soll ein Teleskop bewegt werden. Dabei sende ich beim Klicken auf den Button einen Befehl über die Serielle Schnittstelle der das Teleskop in Bewegung versetzt und beim Loslassen wieder einen Befehl der das ganze stoppt.

Ja das mit Tab ist mit bewusst. Im Prinzip ist es nur für die Maus gedacht, aber falls das ganze auch mit Tab funktioniert wäre das eine nette Draufgabe.

Sleep() wird beim Senden des Befehls verwendet. Es wartet auf ein Acknowledge vom Teleskop. Theoretisch lässt sich dieses Sleep() vermeiden, doch ich will es nicht unnötig ausbauen da es eigentlich eine sehr komote Lösung ist.


Ralf Jansen - Fr 06.08.10 19:48

Dann müsste man deinen Code sehen um dein Problem zu erkennen. Theoretisch sollte das so eigentlich funktionieren können.

Alternativ würde ich gleich anders ansetzen. Ich würde nicht 4 Buttons nehmen sondern nur 1 Control (Panel, leeres UserControl etc. oder was eigenes, eigentlich egal Hauptsache nur eine Oberfläche). In MouseEnter einen Thread starten und in MouseLeave stoppen. In diesem Thread regelmäßig die Position der Mouse und den Status der MouseButtons checken (über die statischen Control.MouseButtons bzw. Control.MousePosition Properties) und eben daraufhin die gewünschte Teleskopbewegung ausführen. Ein solches Vorgehen halte ich für weniger problematisch. Über Events so wie von dir begonnen ergeben sich doch ein paar logische Löcher im UI Verhalten (z.B das angesprochene TAB Problemchen) denen man mit zusätzlichem Code entgegen wirken müsste.


DummyScript - Sa 07.08.10 12:23

Hab das Problem gelöst. Das Clickevent wird nämlich auch erst beim Loslassen der Maustaste aufgerufen. Mit dem MouseDown Event funkioniert es.

Danke für deine Hilfe!


jaenicke - Sa 07.08.10 14:52

user profile iconDummyScript hat folgendes geschrieben Zum zitierten Posting springen:
Hab das Problem gelöst. Das Clickevent wird nämlich auch erst beim Loslassen der Maustaste aufgerufen.
Klar, denn beim Herunterdrücken der Maustaste kann das System ja noch nicht wissen, ob es ein Klick wird oder z.B. ein Ziehen.

Ein Klick heißt Drücken und wieder loslassen. Dementsprechend kann das Event Click auch erst beim Loslassen ausgelöst werden.