Unterscheiden zwischen Klick und Doppelklick
-
Hallo,
ich stehe gerade vor dem Problem in einem Programm zwischen zwei Mausaktionen,
WM_LBUTTONDBLCLK und WM_LBUTTONUP, zu unterscheiden, was etwas verzwickt ist,
weil eine WM_LBUTTONDBLCLK-Nachricht auch immer, unter anderem, zwei
WM_LBUTTONUP-Nachrichten mit sich bringt. Gibt es hier eine Standardvorgehens-
weise zu erkennen, wann es sich um einen Doppelklick und wann es sich um einen
einfachen Klick handelt?
-
hm ... gib mal nochn paar Infos. So wie ich das verstehe reagierst du sowohl auf einen Click als auch auf einen DblClick, willst aber nicht auf den Click reagieren der ja zwangsläufig 2 mal ausgelöst wird, wenn es sich um einen DblClick handelt.
Richtig?
Oder willst du den Click schon behandeln, aber nur einmal statt 2 mal?
Was du machen könntest (und was sicherlich auch std ist (keine Gewähr)) ist mit deiner Click-Reaktion so lange zu warten, bis du einen DblClick ausschließen kannst, das sind ja nur ein paar Millisekunden, das stört sicher nicht. Dazu legst du einfach eine boolsche Variable an die für beide Messages sichtbar ist und bei DblClick setzt du sie auf true, beim Click schaust du dann nach den paar millisekunden ob die Variable auf true ist und führst nur dann die Aktionen aus, ansonsten setzt du die Variable wieder auf false. EDIT: Da Click ja zweimal aufgerufen wird musst du statt ner boolschen Variable mit ner int arbeiten und incrementieren und decramentieren ... u know?
Geholfen?
-
musste dir selbst wsa frickeln, wie du schon sagtest
-
Ausleuchtung mit Pseudo-Code:
//der Einfachheit halber globale Variable int iDblClick = 0; ... MessageHandler() { switch(msg) { case WM_LBUTTONDBLCLK: { iDblClick = 2; //dein DoubleClick-Code } case WM_LBUTTONUP: { Sleep(GetDoubleClickTime()); //der Einfachheit halber Sleep if(iDblClick <= 0) { //dein Click-Code } else { --iDblClick; } } } ... }Sleep() und das mit der globalen Variable kann sicher besser gelöst werden, ansonsten sollte jetzt klar sein, wie du das Problem lösen kannst.
-
Man muss Click und Doppelklick in der Funkltionsweise doch gar nichtunterscheiden.
Einfach-Klick selektiert.
Doppelklick-führt aus.Ansonsten kannst Du beim ersten Click einen Timer setzen. AM besten mit dre Länge des Dopelklickintervalles.
Geht in der zwischenzeit bevor der Timer fällt ein weitere Klick ein bzw. der Doppelklick dan weißt Du, dass eben doppelt geklickt wurde. Geht keine weitere Info ein, dann weißt Du das es nur ein einfacher Klick war.Die von dust vorgestellte Sleep Variante finde ich unmöglich...

-
Tatsächlich Martin, hast du exakt das wiederholt was ich schon 2 mal geschrieben habe, und das mit Sleep steht auch unten drunter, dass man das nicht so lösen soll. Ist jawohl logisch, dass man im MainThread kein Sleep benutzt...
-
Danke für eure Antworten, an eine Timersteuerung hatte ich auch schon gedacht,
aber mir ist inzwischen etwas anderes eingefallen, was besser in die Programm-
logik paßt, da in meinem Programm etwas gezeichnet wird und somit die
WM_LBUTTONDOWN und WM_LBUTTONUP Nachricht unterschiedlich bearbeitet werden
ist es für mich einfacher die Mausbewegung zu protokollieren und die einfachen
Klick-Nachrichten, bei denen die Maus nicht bewegt wurde, wie es bei
WM_LBUTTONDBLCLK der Fall sein sollte, zu verwerfen,
-
js schrieb:
da in meinem Programm etwas gezeichnet wird und somit die WM_LBUTTONDOWN und WM_LBUTTONUP Nachricht unterschiedlich bearbeitet werden
Laut MSDN ist ein "Klick" == "WM_LBUTTONDOWN -> WM_LBUTTONUP",
Und ein "Doppelklick" == "WM_LBUTTONDOWN -> WM_LBUTTONUP -> WM_LBUTTONDBLCLICK -> WM_LBUTTONUP".
Da wird ein Flag ausreichend sein um beide zu unterscheiden :case WM_LBUTTONDOWN : { ... flag = 1; } case WM_LBUTTONDBLCLICK : { ... flag = 2; } case WM_LBUTTONUP : { if (flag == 1) { // gehört zu Klick } if (flag == 2) { // gehört zu Doppelklick } flag = 0; // flag hier immer zurücksetzen } case WM_MOUSEMOVE : { if (flag == 1) { // gehört zu Klick } if (flag == 2) { // gehört zu Doppelklick } // flag = 0; // flag hier immer zurücksetzen }*edit* Bei WM_MOUSEMOVE das Flag natürlich nicht zurücksetzen.