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:
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