Mensaje WM_POINTERDOWN
Publicado cuando un puntero realiza contacto sobre el área cliente de una ventana. Este mensaje de entrada tiene como destino la ventana en la que el puntero realiza contacto, y el puntero se captura implícitamente en la ventana de forma que esa ventana continúa recibiendo la entrada del puntero hasta que interrumpe el contacto.
Una ventana recibe este mensaje mediante la función WindowProc.
Importante
Las aplicaciones de escritorio deben tener en cuenta ppp. Si la aplicación no es compatible con ppp, las coordenadas de pantalla contenidas en los mensajes de puntero y las estructuras relacionadas pueden parecer inexactas debido a la virtualización de ppp. La virtualización de ppp proporciona compatibilidad de escalado automático con aplicaciones que no son compatibles con ppp y que están activas de manera predeterminada (los usuarios pueden desactivarla). Para obtener más información, consulte Escritura de aplicaciones Win32 con valores altos de ppp.
#define WM_POINTERDOWN 0x0246
Parámetros
-
wParam
-
Contiene información sobre el puntero. Use las siguientes macros para recuperar la información del parámetro wParam:
GET_POINTERID_WPARAM(wParam): identificador de puntero.
IS_POINTER_NEW_WPARAM(wParam): una marca que indica si este mensaje representa la primera entrada generada por un nuevo puntero.
IS_POINTER_INRANGE_WPARAM(wParam): una marca que indica si un puntero generó este mensaje durante su vigencia. Esta marca no está establecida en los mensajes que indican que el puntero tiene un intervalo de detección izquierdo.
IS_POINTER_INCONTACT_WPARAM(wParam): una marca que indica si un puntero que está en contacto con la superficie de la ventana generó este mensaje. Esta marca no está establecida en los mensajes que indican un puntero de desplazamiento.
IS_POINTER_PRIMARY_WPARAM(wParam): indica que este puntero se ha designado como principal.
IS_POINTER_FIRSTBUTTON_WPARAM(wParam): una marca que indica si hay una acción principal.
- Esto es análogo a un botón izquierdo del mouse hacia abajo.
- Un puntero táctil tendrá esto establecido cuando esté en contacto con la superficie del digitalizador.
- Un puntero de pluma tendrá esto establecido cuando esté en contacto con la superficie del digitalizador sin presionar ningún botón.
IS_POINTER_SECONDBUTTON_WPARAM(wParam): una marca que indica si hay una acción secundaria.
- Esto es análogo a un botón derecho del mouse hacia abajo.
- Un puntero de pluma tendrá esto establecido cuando esté en contacto con la superficie del digitalizador con el botón de menú contextual de lápiz presionado.
IS_POINTER_THIRDBUTTON_WPARAM(wParam): una marca que indica si hay una o varias acciones terciarias basadas en el tipo de puntero; las aplicaciones que desean responder a acciones terciarias deben recuperar información específica del tipo de puntero para determinar qué botones terciarios se presionan. Por ejemplo, una aplicación puede determinar los estados de botones de un lápiz llamando a GetPointerPenInfo y examinando las marcas que especifican estados de botón.
IS_POINTER_FOURTHBUTTON_WPARAM(wParam): una marca que indica si el puntero especificado realizó la cuarta acción. Las aplicaciones que quieran responder a cuartas acciones deben recuperar información específica del tipo de puntero para determinar si se presiona el primer botón extendido del mouse (XButton1).
IS_POINTER_FIFTHBUTTON_WPARAM(wParam): una marca que indica si el puntero especificado realizó la quinta acción. Las aplicaciones que desean responder a quintas acciones deben recuperar información específica del tipo de puntero para determinar si se presiona el segundo botón extendido del mouse (XButton2).
Consulte Marcas de puntero para obtener más detalles.
Nota:
Un puntero que mantiene el mouse no tiene ninguna de las marcas de botón establecidas. Esto es análogo a un movimiento del mouse sin botones del mouse hacia abajo. Una aplicación puede determinar los estados de botones de un lápiz de desplazamiento, por ejemplo, llamando a GetPointerPenInfo y examinando las marcas que especifican estados de botón.
-
lParam
-
Contiene la ubicación de punto del puntero.
Nota:
Dado que el puntero puede establecer contacto con el dispositivo sobre un área no trivial, esta ubicación de punto puede ser una simplificación de un área de puntero más compleja. Siempre que sea posible, una aplicación debe usar la información completa del área de puntero en lugar de la ubicación del punto.
Use las macros siguientes para recuperar las coordenadas de pantalla físicas del punto.
- GET_X_LPARAM(lParam): coordenada x (punto horizontal).
- GET_Y_LPARAM(lParam): coordenada y (punto vertical).
Valor devuelto
Si la aplicación procesa este mensaje, debe devolver cero.
Si la aplicación no procesa este mensaje, debe llamar a DefWindowProc.
Comentarios
Importante
Cuando una ventana pierde la captura de un puntero y recibe la notificación de WM_POINTERCAPTURECHANGED, normalmente no recibirá ninguna notificación adicional. Por este motivo, es importante que no realice ninguna suposición basada en las notificaciones emparejadas uniformemente WM_POINTERDOWN/WM_POINTERUP o WM_POINTERENTER/WM_POINTERLEAVE.
Cada puntero tiene un identificador de puntero único durante su vigencia. La duración de un puntero comienza cuando se detecta por primera vez.
Se genera un mensaje WM_POINTERENTER si se detecta un puntero de desplazamiento. Se genera un mensaje WM_POINTERDOWN seguido de un mensaje WM_POINTERENTER si se detecta un puntero de no desplazamiento.
Durante su vigencia, un puntero puede generar una serie de mensajes WM_POINTERUPDATE mientras mantiene el puntero o está en contacto.
La duración de un puntero finaliza cuando ya no se detecta. Esto genera un mensaje WM_POINTERLEAVE.
Cuando se anula un puntero, se establece POINTER_FLAG_CANCELED.
También se puede generar un mensaje WM_POINTERLEAVE cuando un puntero no capturado se mueve fuera de los límites de una ventana.
Use lo siguiente para obtener la posición horizontal y vertical de un puntero:
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
Use la macro MAKEPOINTS para convertir el parámetro lParam en una estructura POINTS.
Para recuperar más información asociada al mensaje, use la función GetPointerInfo.
La función GetKeyState se puede usar para determinar los estados de teclas modificadoras de teclado asociados a este mensaje. Por ejemplo, para detectar que se ha pulsado la tecla ALT, compruebe si GetKeyState(VK_MENU) < 0.
Tenga en cuenta que si la aplicación no procesa este mensaje, DefWindowProc puede generar uno o varios mensajes WM_GESTURE si la secuencia de entrada de este y, posiblemente, otros punteros se reconocen como un gesto. Si no se reconoce un gesto, DefWindowProc puede generar la entrada del mouse.
Si una aplicación consume de forma selectiva alguna entrada de puntero y pasa el resto a DefWindowProc, el comportamiento resultante no está definido.
Cuando una ventana pierde la captura de un puntero y recibe la notificación WM_POINTERCAPTURECHANGED, normalmente no recibirá ninguna notificación adicional. Por lo tanto, es importante que una ventana no realice ninguna suposición de su estado de puntero, independientemente de si recibe notificaciones DOWN/UP o ENTER/LEAVE emparejadas uniformemente.
Ejemplos
En el ejemplo de código siguiente se muestra cómo usar IS_POINTER_FIRSTBUTTON_WPARAM, GET_X_LPARAM, GET_Y_LPARAM y IS_POINTER_SECONDBUTTON_WPARAM para recuperar información relevante asociada al mensaje WM_POINTERDOWN.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
if (IS_POINTER_PRIMARYBUTTON_WPARAM(wParam))
{
// process pointer down, similar to mouse left button down
}
else if (IS_POINTER_SECONDARYBUTTON_WPARAM(wParam))
{
// process pointer down, similar to mouse right button down
}
En el ejemplo de código siguiente se muestra cómo usar GET_POINTERID_WPARAM para recuperar el identificador de puntero del mensaje WM_POINTERDOWN.
POINTER_INFO pointerInfo;
UINT32 pointerId = GET_POINTERID_WPARAM(wParam);
// Retrieve common pointer information
if (!GetPointerInfo(pointerId, &pointerInfo))
{
// failure, call GetLastError()
}
else
{
// success, process pointerInfo
}
En el ejemplo de código siguiente se muestra cómo controlar diferentes tipos de puntero, como dispositivos táctiles, lápiz o punteros predeterminados.
POINTER_TOUCH_INFO touchInfo;
POINTER_PEN_INFO penInfo;
POINTER_INFO pointerInfo;
UINT32 pointerId = GET_POINTERID_WPARAM(wParam);
POINTER_TYPE pointerType = PT_POINTER;
// default to unhandled to enable call to DefWindowProc
fHandled = FALSE;
if (!GetPointerType(pointerId, &pointerType))
{
// failure, call GetLastError()
// set PT_POINTER to fall to default case below
pointerType = PT_POINTER;
}
switch (pointerType)
{
case PT_TOUCH:
// Retrieve touch information
if (!GetPointerTouchInfo(pointerId, &touchInfo))
{
// failure, call GetLastError()
}
else
{
// success, process touchInfo
// mark as handled to skip call to DefWindowProc
fHandled = TRUE;
}
break;
case PT_PEN:
// Retrieve pen information
if (!GetPointerPenInfo(pointerId, &penInfo))
{
// failure, call GetLastError()
}
else
{
// success, process penInfo
// mark as handled to skip call to DefWindowProc
fHandled = TRUE;
}
break;
default:
if (!GetPointerInfo(pointerId, &pointerInfo))
{
// failure.
}
else
{
// success, proceed with pointerInfo.
fHandled = HandleGenericPointerMessage(&pointerInfo);
}
break;
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo compatible |
Windows 8 [solo aplicaciones de escritorio] |
Servidor mínimo compatible |
Windows Server 2012 [solo aplicaciones de escritorio] |
Encabezado |
|
Consulte también
-
Referencia