WM_POINTERDOWN mensagem
Postado quando um ponteiro faz contato sobre a área do cliente de uma janela. Essa mensagem de entrada direciona a janela sobre a qual o ponteiro faz contato e o ponteiro é capturado implicitamente para a janela para que a janela continue recebendo entrada para o ponteiro até que ele interrompa o contato.
Uma janela recebe essa mensagem por meio de sua funçãoWindowProc.
! [Importante]
Os aplicativos da área de trabalho devem estar cientes do DPI. Se o aplicativo não estiver ciente do DPI, as coordenadas de tela contidas em mensagens de ponteiro e estruturas relacionadas poderão parecer imprecisas devido à virtualização de DPI. A virtualização de DPI fornece suporte de dimensionamento automático para aplicativos que não têm reconhecimento de DPI e estão ativos por padrão (os usuários podem desativá-lo). Para obter mais informações, consulte High-DPIaplicativos Win32 .
#define WM_POINTERDOWN 0x0246
Parâmetros
-
wParam
-
Contém informações sobre o ponteiro. Use as macros a seguir para recuperar informações do parâmetro wParam.
GET_POINTERID_WPARAM(wParam): o identificador do ponteiro.
IS_POINTER_NEW_WPARAM(wParam): um sinalizador que indica se essa mensagem representa a primeira entrada gerada por um novo ponteiro.
IS_POINTER_INRANGE_WPARAM(wParam): um sinalizador que indica se essa mensagem foi gerada por um ponteiro durante seu tempo de vida. Esse sinalizador não é definido em mensagens que indicam que o ponteiro tem o intervalo de detecção à esquerda
IS_POINTER_INCONTACT_WPARAM(wParam): um sinalizador que indica se essa mensagem foi gerada por um ponteiro que está em contato com a superfície da janela. Esse sinalizador não é definido em mensagens que indicam um ponteiro de foco.
IS_POINTER_PRIMARY_WPARAM(wParam): indica que esse ponteiro foi designado como primário.
IS_POINTER_FIRSTBUTTON_WPARAM(wParam): um sinalizador que indica se há uma ação primária.
- Isso é análogo a um botão esquerdo do mouse para baixo.
- Um ponteiro de toque terá esse conjunto quando estiver em contato com a superfície do digitalizador.
- Um ponteiro de caneta terá esse conjunto quando estiver em contato com a superfície do digitalizador sem botões pressionados.
IS_POINTER_SECONDBUTTON_WPARAM(wParam): um sinalizador que indica se há uma ação secundária.
- Isso é análogo a um botão direito do mouse para baixo.
- Um ponteiro de caneta terá esse conjunto quando estiver em contato com a superfície do digitalizador com o botão de barril de caneta pressionado.
IS_POINTER_THIRDBUTTON_WPARAM(wParam): um sinalizador que indica se há uma ou mais ações terciárias com base no tipo de ponteiro; os aplicativos que desejam responder a ações terciárias devem recuperar informações específicas para o tipo de ponteiro para determinar quais botões terciários são pressionados. Por exemplo, um aplicativo pode determinar os estados de botões de uma caneta chamando GetPointerPenInfo e examinando os sinalizadores que especificam estados de botão.
IS_POINTER_FOURTHBUTTON_WPARAM(wParam): um sinalizador que indica se o ponteiro especificado tomou a quarta ação. Os aplicativos que desejam responder às quartas ações devem recuperar informações específicas para o tipo de ponteiro para determinar se o primeiro botão de mouse estendido (XButton1) é pressionado.
IS_POINTER_FIFTHBUTTON_WPARAM(wParam): um sinalizador que indica se o ponteiro especificado tomou a quinta ação. Os aplicativos que desejam responder às quintas ações devem recuperar informações específicas para o tipo de ponteiro para determinar se o segundo botão de mouse estendido (XButton2) é pressionado.
Consulte sinalizadores de ponteiro para obter mais detalhes.
Nota
Um ponteiro de foco não tem nenhum dos sinalizadores de botão definidos. Isso é análogo a uma movimentação de mouse sem botões de mouse para baixo. Um aplicativo pode determinar os estados de botões de uma caneta focalizador, por exemplo, chamando GetPointerPenInfo e examinando os sinalizadores que especificam estados de botão.
-
lParam
-
Contém o local do ponto do ponteiro.
Nota
Como o ponteiro pode fazer contato com o dispositivo em uma área não trivial, esse local de ponto pode ser uma simplificação de uma área de ponteiro mais complexa. Sempre que possível, um aplicativo deve usar as informações completas da área do ponteiro em vez do local do ponto.
Use as macros a seguir para recuperar as coordenadas de tela física do ponto.
- GET_X_LPARAM(lParam): a coordenada x (ponto horizontal).
- GET_Y_LPARAM(lParam): a coordenada y (ponto vertical).
Valor de retorno
Se um aplicativo processar essa mensagem, ela deverá retornar zero.
Se o aplicativo não processar essa mensagem, ele deverá chamar DefWindowProc.
Observações
! [Importante]
Quando uma janela perde a captura de um ponteiro e recebe a notificação WM_POINTERCAPTURECHANGED, normalmente não receberá mais notificações. Por esse motivo, é importante que você não faça suposições com base em notificações de WM_POINTERDOWN/WM_POINTERUP ou WM_POINTERENTER/WM_POINTERLEAVE emparelhadas uniformemente.
Cada ponteiro tem um identificador de ponteiro exclusivo durante seu tempo de vida. O tempo de vida de um ponteiro começa quando ele é detectado pela primeira vez.
Uma mensagem de WM_POINTERENTER será gerada se um ponteiro focalizador for detectado. Uma mensagem WM_POINTERDOWN seguida por uma mensagem de WM_POINTERENTER será gerada se um ponteiro não focalizador for detectado.
Durante seu tempo de vida, um ponteiro pode gerar uma série de mensagens WM_POINTERUPDATE enquanto ele está pairando ou em contato.
O tempo de vida de um ponteiro termina quando ele não é mais detectado. Isso gera uma mensagem de WM_POINTERLEAVE.
Quando um ponteiro é anulado, POINTER_FLAG_CANCELED é definido.
Uma mensagem WM_POINTERLEAVE também pode ser gerada quando um ponteiro não capturado se move para fora dos limites de uma janela.
Para obter a posição horizontal e vertical de um ponteiro, use o seguinte:
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
Para converter o parâmetro lParam em uma estrutura POINTS), use a macroMAKEPOINTS.
Para recuperar mais informações associadas à mensagem, use a funçãogetPointerInfo.
Para determinar os estados de tecla modificador de teclado associados a essa mensagem, use a função GetKeyState. Por exemplo, para detectar se a tecla ALT foi pressionada, verifique se GetKeyState(VK_MENU) < 0.
Observe que, se o aplicativo não processar essa mensagem, DefWindowProc poderá gerar uma ou mais mensagens WM_GESTURE se a sequência de entrada dessa e, possivelmente, outros ponteiros forem reconhecidos como um gesto. Se um gesto não for reconhecido, DefWindowProc poderá gerar entrada do mouse.
Se um aplicativo consumir seletivamente alguma entrada de ponteiro e passar o restante para DefWindowProc, o comportamento resultante será indefinido.
Quando uma janela perde a captura de um ponteiro e recebe a notificação WM_POINTERCAPTURECHANGED, normalmente não receberá mais notificações. Portanto, é importante que uma janela não faça nenhuma suposição de seu status de ponteiro, independentemente de receber notificações pardas uniformemente para BAIXO/PARA CIMA ou ENTER/LEAVE.
Exemplos
O exemplo de código a seguir mostra como usar IS_POINTER_FIRSTBUTTON_WPARAM, GET_X_LPARAM, GET_Y_LPARAMe IS_POINTER_SECONDBUTTON_WPARAMpara recuperar as informações relevantes associadas à mensagem 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
}
O exemplo de código a seguir mostra como usar GET_POINTERID_WPARAM para recuperar a ID do ponteiro da mensagem 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
}
O exemplo de código a seguir mostra como lidar com diferentes tipos de ponteiro, como toque, caneta ou dispositivos de apontamento padrão.
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 com suporte |
Windows 8 [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte |
Windows Server 2012 [somente aplicativos da área de trabalho] |
Cabeçalho |
|
Consulte também
-
de referência de