Compartir a través de


Respuesta a los clics del ratón

Si el usuario hace clic en un botón del ratón mientras el cursor está sobre el área cliente de una ventana, la ventana recibirá uno de los mensajes siguientes.

Mensaje Significado
WM_LBUTTONDOWN Botón izquierdo pulsado
WM_LBUTTONUP Botón izquierdo levantado
WM_MBUTTONDOWN Botón central pulsado
WM_MBUTTONUP Botón central soltado
WM_RBUTTONDOWN Botón derecho pulsado
WM_RBUTTONUP Botón derecho soltado
WM_XBUTTONDOWN XBUTTON1 o XBUTTON2 pulsado
WM_XBUTTONUP XBUTTON1 o XBUTTON2 soltado

 

Recuerde que el área cliente es la parte de la ventana que no incluye el marco. Para obtener más información sobre las áreas cliente, consulte ¿Qué es una ventana?

Coordenadas del ratón

En todos estos mensajes, el parámetro lParam contiene la coordenada x y la coordenada y del puntero del ratón. Los 16 bits más bajos de lParam incluyen la coordenada x y los 16 bits siguientes incluyen la coordenada y. Use las macros GET_X_LPARAM y GET_Y_LPARAM para desempaquetar las coordenadas de lParam.

int xPos = GET_X_LPARAM(lParam); 
int yPos = GET_Y_LPARAM(lParam);

Estas macros se definen en el archivo de encabezado WindowsX.h.

En Windows de 64 bits, lParam es un valor de 64 bits. No se usan los 32 bits superiores de lParam. Cuando en la documentación de Windows se menciona la "palabra de orden bajo" y "palabra de orden alto" de lParam, en el caso de 64 bits son las palabras de orden bajo y alto de los 32 bits inferiores. Las macros extraen los valores correctos, por lo que si los usa, no habrá problema.

Las coordenadas del ratón se representan en píxeles, no píxeles independientes del dispositivo (DIP), y se miden en relación con el área cliente de la ventana. Las coordenadas son valores firmados. Las posiciones situadas encima y a la izquierda del área cliente tienen coordenadas negativas, lo que es importante si rastrea la posición del ratón fuera de la ventana. Veremos cómo hacerlo en otro tema más adelante, Captura de movimiento del ratón fuera de la ventana.

Flags adicionales

El parámetro wParam contiene un OR bit a bit de flags, que indica el estado de los otros botones del ratón, aparte de las teclas MAYÚS y CTRL.

Marca Significado
MK_CONTROL La tecla CTRL está presionada.
MK_LBUTTON El botón izquierdo del mouse está presionado.
MK_MBUTTON El botón central del mouse está presionado.
MK_RBUTTON El botón derecho del mouse está presionado.
MK_SHIFT La tecla MAYÚS está presionada.
MK_XBUTTON1 El botón XBUTTON1 está pulsado.
MK_XBUTTON2 El botón XBUTTON2 está pulsado.

 

La ausencia de una flag significa que no se ha pulsado el botón o la tecla correspondientes. Por ejemplo, para probar si la tecla CTRL está pulsada:

if (wParam & MK_CONTROL) { ...

Si necesita detectar el estado de otras teclas, además de CTRL y MAYÚS, use la función GetKeyState, que se describe en Entrada del teclado.

Los mensajes de ventana WM_XBUTTONDOWN y WM_XBUTTONUP se aplican tanto a XBUTTON1 como a XBUTTON2. El parámetro wParam indica en qué botón se ha hecho clic.

UINT button = GET_XBUTTON_WPARAM(wParam);  
if (button == XBUTTON1)
{
    // XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
    // XBUTTON2 was clicked.
}

Dobles clics

Una ventana no recibe notificaciones de doble clic de forma predeterminada. Para recibir doble clics, cree la flag CS_DBLCLKS en la estructura WNDCLASS al registrar la clase de ventana.

    WNDCLASS wc = { };
    wc.style = CS_DBLCLKS;

    /* Set other structure members. */

    RegisterClass(&wc);

Si crea la flag CS_DBLCLKS, tal como se muestra, la ventana recibirá notificaciones de doble clic. Un doble clic se indica mediante un mensaje de ventana con "DBLCLK" en el nombre. Por ejemplo, un doble clic en el botón izquierdo del ratón genera la siguiente secuencia de mensajes:

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

Así pues, el segundo mensaje WM_LBUTTONDOWN que normalmente se generaría, se convierte en un mensaje WM_LBUTTONDBLCLK. Los mensajes equivalentes se definen para los botones derecho, central y XBUTTON.

Hasta que reciba el mensaje de doble clic, no hay forma de indicar que el primer clic del ratón es el inicio de un doble clic. Por tanto, a una acción de doble clic debe seguirle una acción que comience con el primer clic del ratón. Por ejemplo, en el Shell de Windows, un solo clic permite seleccionar una carpeta, mientras que con un doble clic se abre.

Mensajes del ratón fuera del área cliente

Existe un grupo independiente de mensajes para los eventos del ratón que se producen dentro del área que no es cliente de la ventana. Estos mensajes tienen las letras "NC" en el nombre. Por ejemplo, WM_NCLBUTTONDOWN es el equivalente no cliente de WM_LBUTTONDOWN. Una aplicación normal no interceptará estos mensajes, ya que la función DefWindowProc controla estos mensajes correctamente. Sin embargo, pueden ser útiles para determinadas funciones avanzadas. Por ejemplo, podría usar estos mensajes para implementar acciones personalizadas en la barra de título. Si controla estos mensajes, normalmente debe pasarlos después a DefWindowProc. De lo contrario, la aplicación interrumpirá la funcionalidad estándar, como arrastrar o minimizar la ventana.

Siguientes

Movimiento del ratón