2009-02-03 8 views
5

In MFC un evento di doppio clic del mouse si innesca la seguente sequenza di messaggiRilevamento di un semplice clic del mouse in MFC

  • WM_LBUTTONDOWN
  • WM_LBUTTONUP
  • WM_LBUTTONDBCLK
  • WM_LBUTTONUP

Così rispondere al messaggio WM_LBUTTONDBCLK consente di rilevare un doppio -clic. Ma se voglio solo rilevare un singolo clic come faccio a distinguerlo?

Ma il solo sguardo al messaggio WM_LBUTTONUP non è sufficiente in quanto potrebbe essere un singolo clic o potrebbe essere il primo clic di un doppio clic.

Come posso identificare con successo un singolo clic?

risposta

10

(Mi permetta di chiamare questi eventi mouse su e mouse verso il basso. La mia MFC è un po 'arrugginito. E non c'è questa roba chiamata .NET che è stato in disordine mia terminologia ultimamente ;-)

Breve storia : Non vuoi semplicemente sapere del clic del mouse. Hai bisogno di più.

Lunga storia:

Anche se questo è contro-intuitivo, sembra che semplicemente vogliono un clic del mouse è abbastanza raro. Molto spesso, ti consigliamo di eseguire alcune elaborazioni su Mouse Down e di eseguire ulteriori elaborazioni su Mouse Up. Il trucco è che il semplice monitoraggio dei messaggi Mouse Up non è sufficiente: Mouse Down potrebbe non essersi verificato nella tua finestra. Lo consideri un clic valido allora? Soprattutto se si considera che l'elaborazione Mouse Down (come la selezione di un elemento) non si è verificata.

Andando oltre il ragionamento, non si dovrebbe fare affidamento sulla ricezione di un mouse dopo aver elaborato il mouse verso il basso: l'utente potrebbe aver spostato il mouse e rilasciato il pulsante da qualche altra parte (pensate a drag'n'drop), nel qual caso, non ricevi l'evento MouseUp ... a meno che non catturi il mouse su MouseDown per assicurarti di ottenere l'evento del mouse fino a Mouse Up anche se il mouse lascia la tua finestra.

Tutto sommato, si finisce col rintracciare Mouse Down, catturare il mouse e quando si riceve Mouse Up, è sufficiente controllare se si possiede la cattura. In caso contrario, il mouse è stato fatto doppio clic (nessun secondo mouse verso il basso) o Mouse Down è successo da qualche altra parte, quindi molto probabilmente non ti importa di questo Mouse Up.

In conclusione: Non c'è un messaggio MouseClick semplicemente perché non si andrebbe molto lontano con esso: è necessario gestire più messaggi e implementare più meccanismi comunque.

Oh! E se hai a che fare con un controllo esistente che gestisce già tutti questi elementi e elementi di selezione, come ad esempio un elenco, è probabile che fornisca una notifica personalizzata simile come Attiva oggetto o Selezione oggetto modificata.

-2

Generalmente si guarda @ MLButtonUp e non si avrebbe un singolo clic e un doppio clic sullo stesso pulsante del mouse.

0

È possibile verificare che WM_LBUTTONDOWN non sia stato chiamato più volte prima di WM_LBUTTONUP. In pratica, Windows fa questo per te, in quanto se ottieni un WM_LBUTTONDBCLK tendi a non ottenere un WM_LBUTTONUP.

0

È possibile utilizzare PreTranslateMessage() per contare i messaggi così come appaiono. Se sono stati ricevuti solo i messaggi del mouse corrispondenti a un clic singolo e il tempo configurato dal sistema per il doppio clic è scaduto, è possibile presumere che si tratti di un clic singolo.

Per quanto ne so non c'è modo di sapere che questo è il caso in cui sta accadendo, il che ha senso - fino a quando il tempo è scaduto, non c'è modo di sapere che un secondo clic è o non è venuta.

0

è un po 'complicato.

Vorrei rilevare la combinazione WM_LBUTTONDOWN & WM_LBUTTONUP, archiviare quell'evento da qualche parte e impostare un timeout per un secondo circa. Se non c'è un WM_LBUTTONDBCLK durante quel timeout, allora hai un solo clic.

Ciò potrebbe implicare la necessità di avere un altro thread in esecuzione ma penso che si possa realizzare con un thread.

1

Ho appena provato questo in Delphi, il comportamento è lo stesso: anche quando un doppio clic sta accadendo, un evento click singolo viene rilasciato subito dopo il primo dei due.

ho risolto utilizzando un timer, che funziona così:

  • timer Disattivazione On WM_LBUTTONDBLCLK (e impostare bDbl a true)
  • timer attivare il WM_LBUTTONUP se bDbl==false
  • disattivare il WM_LBUTTONUP se bDbl==true (e resettare bDbl)

Ho impostato l'inte rval del timer all'ora restituita da GetDoubleClickTime.

MSDN dice:

La funzione GetDoubleClickTime recupera l'ora attuale doppio clic per il mouse. Un doppio clic è una serie di due clic del pulsante del mouse , il secondo che si verifica entro un'ora specificata dopo il primo . Il tempo di doppio clic è il numero massimo di millisecondi tra tra il primo e il secondo clic di un doppio clic.

Se il timer si verifica, il clic reale. Nel mio caso l'intervallo di doppio clic è di 500 ms, quindi qualsiasi "clic reale" verrà ritardato a lungo.

0

Penso che la soluzione sia quella di avviare un timer dopo il primo clic & quindi controllare il tempo trascorso dopo al prossimo clic immediato, questo vi dirà se è un singolo clic o doppio clic.