MouseDown und Click-Konflikt

8

Ich habe eine Drag () -Methode für das Ereignis form_MouseDown. Ich habe auch ein Klickereignis auf dem Formular. Das Problem ist, dass, wenn ich auf das Formular klicke, das MouseDown-Ereignis ausgelöst wird und es nie die Chance bekommt, ein Klick-Ereignis auszulösen.

Was ist der beste Weg, um dieses Problem zu lösen? Ich habe gedacht, Pixel zu zählen, wenn das Formular tatsächlich gezogen wird, aber es muss einen besseren Weg geben. Irgendwelche Vorschläge?

    
Kristian 10.03.2013, 12:43
quelle

3 Antworten

2
  

Ich dachte, Pixel zu zählen, wenn das Formular tatsächlich gezogen wird, aber es muss einen besseren Weg geben.

Nein, genau so musst du es machen.

Dies ist nicht nur eine Softwarebegrenzung; es ist auch sehr praktisch. Wenn Sie das Problem aus der Sicht eines Benutzers durchdenken, sehen Sie sofort das Problem und die Lösung. Fragen Sie sich, was ist der Unterschied zwischen einem Klick und einem Ziehen?

Beide beginnen mit der Maustaste über das Objekt, aber eine von ihnen endet mit der Maustaste über das Objekt in der gleichen Position und die andere endet mit der Maustaste in einer völlig andere Position.

Da die Zeitmaschinen noch nicht perfektioniert wurden, können Sie das im Voraus nicht wissen.

Sie müssen also eine Art von Abstandsschwelle beibehalten, und wenn sich der Zeiger außerhalb dieser Distanzschwelle bewegt, während er sich über dem Objekt befindet, dann halten Sie es für einen Widerstand. Andernfalls halten Sie es für einen Klick.

Dieser Distanzschwellenwert sollte nicht 0 sein. Der Benutzer sollte nicht dazu angehalten werden, die Maus vollständig ruhig zu halten , um einen Widerstand auszulösen. Viele Benutzer sind untergeordnete Mäuse. Sie werden sehr wahrscheinlich leicht zucken, wenn Sie versuchen zu klicken. Wenn der Schwellenwert 0 ist, wird am Ende eine große Anzahl von versehentlichen Ziehen verursacht, wenn sie versuchen zu klicken.

Natürlich müssen Sie sich nicht darum kümmern oder die Widerstandsschwelle selbst berechnen. Verwenden Sie stattdessen die Windows-Standardwerte, die Sie durch Aufrufen der Funktion GetSystemMetrics erhalten und entweder SM_CXDRAG oder SM_CYDRAG angeben können. (Diese können durch das WinForms-Framework irgendwo angezeigt werden, aber ich denke nicht. Es ist genauso einfach, P / Invoice selbst aufzurufen.)

%Vor%     
Cody Gray 10.03.2013, 12:57
quelle
2

Leider wissen Sie zu dem Zeitpunkt, als Sie "gedrückt" haben, noch nicht, ob die gewünschte Aktion nur ein Klick oder ein Drag-Drop ist. Sie werden es später herausfinden .

Für einen Klick lautet die Determinante "no movement" und "button up".

Bei einem Ziehen ist die Determinante "Bewegung" und "Taste hoch".

Um diese Interaktionen zu verdeutlichen, müssen Sie also nicht nur die Knöpfe, sondern auch die Bewegung verfolgen. Sie müssen die Gesamtbewegung nicht verfolgen, nur die Bewegung zwischen Button-Down und Button-Up ist interessant.

Diese Ereignisse sind daher ein guter Ort, um die Mouse.Capture-Mechanismen zu starten / zu stoppen (um Ziehadoren und drop location hints dynamisch zu platzieren) oder, in vereinfachter Form - um den Ursprung und das Ziel des Bewegungsvektors zu speichern und zu prüfen, ob der Abstand & gt; D (selbst wenn eine Bewegung auftrat, sollte es eine sichere Mindestdistanz geben, in der die DRAG abgebrochen wird. Die Maus ist manchmal "gezackt", und die Leute würden es wirklich nicht mögen, dass deine App anfängt zu ziehen, wenn sie am Ende doppelklickt schnelle Mauszeigerbewegung :))

    
quetzalcoatl 10.03.2013 12:51
quelle
2

Ich habe diese Lösung gefunden, obwohl es sich um einen Doppelklick und einen Mausklick nach unten handelt:

%Vor%

Quelle: Ссылка

    
Nico Mondragon Diego 07.09.2015 03:02
quelle

Tags und Links