Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Se o usuário clicar em um botão do mouse enquanto o cursor estiver sobre a área do cliente de uma janela, a janela receberá uma das seguintes mensagens.
| Mensagem | Significado |
|---|---|
| WM_LBUTTONDOWN | Botão esquerdo para baixo |
| WM_LBUTTONUP | Botão esquerdo para cima |
| WM_MBUTTONDOWN | Botão do meio para baixo |
| WM_MBUTTONUP | Solte o botão do meio |
| WM_RBUTTONDOWN | Botão direito para baixo |
| WM_RBUTTONUP | Soltar o botão direito |
| WM_XBUTTONDOWN | XBUTTON1 ou XBUTTON2 para baixo |
| WM_XBUTTONUP | XBUTTON1 ou XBUTTON2 para cima |
Lembre-se que a área do cliente é a parte da janela que exclui o quadro. Para obter mais informações sobre áreas de clientes, consulte O que é uma janela?
Coordenadas do mouse
Em todas essas mensagens, o parâmetro lParam contém as coordenadas x e y do ponteiro do mouse. Os 16 bits mais baixos de lParam contêm a coordenada x e os próximos 16 bits contêm a coordenada y. Use as macros GET_X_LPARAM e GET_Y_LPARAM para extrair as coordenadas a partir de lParam.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
Essas macros são definidas no arquivo de cabeçalho WindowsX.h.
No Windows de 64 bits, lParam é um valor de 64 bits. Os 32 bits superiores de lParam não são usados. Onde a documentação do Windows menciona a "palavra de ordem baixa" e "palavra de ordem alta" de lParam, o caso de 64 bits significa as palavras de ordem baixa e alta dos 32 bits inferiores. As macros extraem os valores certos, portanto, se você usá-los, estará seguro.
As coordenadas do mouse são dadas em pixels, não em pixels independentes do dispositivo (DIPs), e são medidas em relação à área do cliente da janela. As coordenadas são valores assinados. As posições acima e à esquerda da área do cliente têm coordenadas negativas, o que é importante se você rastrear a posição do mouse fora da janela. Veremos como fazer isso em um tópico posterior, Capturando o movimento do mouse fora da janela.
Bandeiras adicionais
O parâmetro wParam contém uma bit a bit OU de sinalizadores, indicando o estado dos outros botões do mouse mais as teclas SHIFT e CTRL.
| Bandeira | Significado |
|---|---|
| MK_CONTROL | A tecla CTRL está inativa. |
| MK_LBUTTON | O botão esquerdo do rato está inativo. |
| MK_MBUTTON | O botão do meio do mouse está para baixo. |
| MK_RBUTTON | O botão direito do rato está inativo. |
| MK_SHIFT | A tecla SHIFT está inativa. |
| MK_XBUTTON1 | O botão XBUTTON1 está inativo. |
| MK_XBUTTON2 | O botão XBUTTON2 está inativo. |
A ausência de uma bandeira significa que o botão ou tecla correspondente não foi pressionado. Por exemplo, para testar se a tecla CTRL está inativa:
if (wParam & MK_CONTROL) { ...
Se tu precisares de encontrar o estado de outras teclas, além de CTRL e SHIFT, usa a função GetKeyState, que é descrita em Entrada de Teclado.
As mensagens da janela WM_XBUTTONDOWN e WM_XBUTTONUP aplicam-se ao XBUTTON1 e ao XBUTTON2. O parâmetro wParam indica qual botão foi clicado.
UINT button = GET_XBUTTON_WPARAM(wParam);
if (button == XBUTTON1)
{
// XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
// XBUTTON2 was clicked.
}
Cliques duplos
Uma janela não recebe notificações de clique duplo por padrão. Para receber cliques duplos, defina o sinalizador CS_DBLCLKS na estrutura WNDCLASS ao registar a classe de janela.
WNDCLASS wc = { };
wc.style = CS_DBLCLKS;
/* Set other structure members. */
RegisterClass(&wc);
Se você definir o sinalizador CS_DBLCLKS como mostrado, a janela receberá notificações de clique duplo. Um duplo clique é indicado por uma mensagem de janela com "DBLCLK" no nome. Por exemplo, um duplo clique no botão esquerdo do rato produz a seguinte sequência de mensagens:
Com efeito, a segunda mensagem WM_LBUTTONDOWN que normalmente seria gerada torna-se uma mensagem WM_LBUTTONDBLCLK. Mensagens equivalentes são definidas para os botões direito, meio e XBUTTON.
Até que você receba a mensagem de clique duplo, não há como dizer que o primeiro clique do mouse é o início de um clique duplo. Portanto, uma ação de clique duplo deve continuar uma ação que começa com o primeiro clique do mouse. Por exemplo, no Shell do Windows, um único clique seleciona uma pasta, enquanto um clique duplo abre a pasta.
Mensagens de mouse fora do cliente
Um conjunto separado de mensagens é definido para eventos de mouse que ocorrem dentro da área não cliente da janela. Estas mensagens têm as letras "NC" no nome. Por exemplo, WM_NCLBUTTONDOWN é o equivalente não cliente de WM_LBUTTONDOWN. Um aplicativo típico não intercetará essas mensagens, porque a função DefWindowProc manipula essas mensagens corretamente. No entanto, eles podem ser úteis para certas funções avançadas. Por exemplo, você pode usar essas mensagens para implementar um comportamento personalizado na barra de título. Se você lidar com essas mensagens, geralmente deve passá-las para DefWindowProc depois. Caso contrário, seu aplicativo quebrará a funcionalidade padrão, como arrastar ou minimizar a janela.
Seguinte