mensaje de WM_POINTERDOWN
Publicado cuando un puntero realiza contacto sobre el área de 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 para que la ventana continúe recibiendo la entrada del puntero hasta que interrumpa el contacto.
Una ventana recibe este mensaje a través de su 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 forma predeterminada (los usuarios pueden desactivarla). Para obtener más información, vea Escritura de High-DPI Aplicaciones Win32.
#define WM_POINTERDOWN 0x0246
Parámetros
-
wParam
-
Contiene información sobre el puntero. Use las macros siguientes para recuperar información del parámetro wParam.
GET_POINTERID_WPARAM(wParam): el identificador del 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á este conjunto cuando esté en contacto con la superficie del digitalizador.
- Un puntero de lápiz tendrá este conjunto cuando esté en contacto con la superficie del digitalizador sin botones presionados.
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 lápiz tendrá este conjunto cuando esté en contacto con la superficie del digitalizador con el botón de barril del 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 de 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 de marcas de puntero para obtener más información.
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 que mantiene el puntero, 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 una aplicación procesa este mensaje, debe devolver cero.
Si la aplicación no procesa este mensaje, debe llamar a DefWindowProc.
Observaciones
! [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 notificaciones WM_POINTERDOWN/WM_POINTERUP o WM_POINTERENTER/WM_POINTERLEAVE emparejadas uniformemente.
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 WM_POINTERENTER mensaje si se detecta un puntero que mantiene el puntero. Se genera un mensaje WM_POINTERDOWN seguido de un mensaje de WM_POINTERENTER si se detecta un puntero sin mantener el puntero.
Durante su duración, un puntero puede generar una serie de mensajes de 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 de WM_POINTERLEAVE cuando un puntero no capturado se mueve fuera de los límites de una ventana.
Para obtener la posición horizontal y vertical de un puntero, use lo siguiente:
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
Para convertir el parámetro lParam en una estructura POINTS), use la macro MAKEPOINTS.
Para recuperar más información asociada al mensaje, use la funciónGetPointerInfo.
Para determinar los estados de tecla modificador de teclado asociados a este mensaje, use la funciónGetKeyState. Por ejemplo, para detectar que se ha presionado 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 ENTRAR/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_LPARAMy IS_POINTER_SECONDBUTTON_WPARAMpara recuperar la información pertinente asociada al mensaje de 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 de 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 admitido |
Windows 8 [solo aplicaciones de escritorio] |
Servidor mínimo admitido |
Windows Server 2012 [solo aplicaciones de escritorio] |
Encabezado |
|
Consulte también
-
de referencia de