2009-02-03 20 views
5

En MFC un evento de clic doble del ratón desencadena la siguiente secuencia de mensajesLa detección de un solo clic del ratón en MFC

  • WM_LBUTTONDOWN
  • WM_LBUTTONUP
  • WM_LBUTTONDBCLK
  • WM_LBUTTONUP

Así respondiendo al mensaje WM_LBUTTONDBCLK le permite detectar un doble -hacer clic. Pero si solo quiero detectar un solo clic cómo distinguirlo?

Pero simplemente mirando el mensaje WM_LBUTTONUP no es suficiente, ya que podría ser un solo clic o podría ser el primer clic de un doble clic.

¿Cómo puedo identificar con éxito solo un clic?

Respuesta

10

(Por favor, permítame llamar a estos eventos ratón hacia arriba y hacia abajo del ratón. Mi MFC es un poco oxidado. Y hay esta cosa llamada .NET que ha estado arruinando mi terminología últimamente ;-)

Breve historia : No solo quiere saber sobre Mouse Click. Necesitas mas.

Larga historia:

Aunque esto es contrario a la intuición, parece que simplemente desean un clic del ratón es bastante infrecuente. En la mayoría de los casos, querrás realizar algún procesamiento en Mouse Down y realizar un procesamiento adicional en Mouse Up. El truco es que simplemente el seguimiento de los mensajes de Mouse Up no es suficiente: puede que Mouse Down no haya sucedido en su ventana. ¿Lo considera un clic válido entonces? Especialmente teniendo en cuenta que el procesamiento de Mouse Down (como la selección de un elemento) no se produjo.

Yendo más allá del razonamiento, no debe confiar en recibir un Mouse Up después de procesar Mouse Down: el usuario puede haber movido el mouse y haber soltado el botón en otro lugar (piense en arrastrar y soltar), en cuyo caso, no recibe el evento MouseUp ... a menos que capture el mouse en MouseDown para asegurarse de que el evento del mouse llegue a Mouse Up, incluso si el mouse dejó su ventana.

Con todo, usted termina rastreando Mouse Down, captura el mouse y cuando recibe Mouse Up, simplemente verifique si posee la captura. Si no, se hizo doble clic en el mouse (no se hizo el 2do mouse hacia abajo) o Mouse Down sucedió en otro lugar, por lo tanto, es muy probable que no te importe este Mouse Up.

En conclusión: No hay mensaje MouseClick simplemente porque no llegaría muy lejos con él: Necesita manejar más mensajes e implementar más mecanismos de todos modos.

¡Oh! Y si se trata de un control existente que ya maneja todos estos elementos y elementos de selección, como una vista de lista, es probable que proporcione una notificación personalizada similar, como Activar artículo o Cambiar elemento seleccionado.

-2

Normalmente mira a @MLButtonUp y no tendría un solo clic y comportamiento de doble clic en el mismo botón del mouse.

0

Puede marcar WM_LBUTTONDOWN no ​​se ha llamado más de una vez antes de WM_LBUTTONUP. En la práctica, Windows hace esto por usted, ya que si obtiene un WM_LBUTTONDBCLK, no suele obtener un WM_LBUTTONUP.

0

Puede usar PreTranslateMessage() para contar los mensajes tal como aparecen. Si ha recibido solo los mensajes del mouse correspondientes a un solo clic, y la hora configurada por el sistema para hacer doble clic ha expirado, puede suponer con seguridad que se trata de un solo clic.

Hasta donde yo sé, no hay forma de saber que este es el caso, ya que está sucediendo, lo cual tiene sentido; hasta que el tiempo expire, no hay forma de saber que un segundo clic es o no viniendo.

0

eso es un poco complicado.

Detectaría el combo WM_LBUTTONDOWN & WM_LBUTTONUP, almaceno ese evento en algún lugar y establezca un tiempo de espera por un segundo más o menos. Si no hay un WM_LBUTTONDBCLK durante ese tiempo de espera, entonces tiene un solo clic.

Esto podría implicar que necesita tener otro hilo ejecutándose pero creo que podría lograrlo con un hilo.

1

Acabo de probar esto en Delphi, el comportamiento es el mismo: incluso cuando hay un doble clic, se emite un solo clic justo después de la primera de las dos.

Lo resuelto mediante un temporizador, que funciona así:

  • temporizador de desactivación de WM_LBUTTONDBLCLK (y establecer bDbl a true)
  • temporizador de activación en WM_LBUTTONUP si bDbl==false
  • desactivar el WM_LBUTTONUP si bDbl==true (y restablecer bDbl)

Establecí el inte rval del temporizador al tiempo devuelto por GetDoubleClickTime.

MSDN dice:

La función GetDoubleClickTime recupera la corriente de tiempo haga doble clic en para el ratón. Un doble clic es una serie de dos clics del botón del mouse, el segundo se produce dentro de un tiempo especificado después del primero. El tiempo de doble clic de es el número máximo de de milisegundos que puede aparecer entre el primer y el segundo clic de haciendo doble clic.

Si el temporizador se dispara, entonces tiene el clic real. En mi caso, el intervalo de doble clic es de 500 ms, por lo que cualquier "clic real" se retrasará tanto tiempo.

0

Creo que la solución es iniciar un temporizador después del primer clic & y luego verificar el tiempo transcurrido después en el siguiente clic inmediato, esto le dirá si es un solo clic o doble clic.

Cuestiones relacionadas