Compartilhar via


Resposta aos cliques do mouse

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 Botão do meio para cima
WM_RBUTTONDOWN Botão direito para baixo
WM_RBUTTONUP Botão direito para cima
WM_XBUTTONDOWN XBUTTON1 ou XBUTTON2 para baixo
WM_XBUTTONUP XBUTTON1 ou XBUTTON2 para cima

 

Lembre-se de que a área do cliente é a parte da janela que exclui o quadro. Para obter mais informações sobre áreas do cliente, 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 descompactar as coordenadas do 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 é o 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 baixa ordem" e a "palavra de alta ordem" de lParam, o caso de 64 bits significa as palavras de baixa e alta ordem dos 32 bits inferiores. As macros extraem os valores corretos, portanto, se você usá-las, estará seguro.

As coordenadas do mouse são fornecidas em pixels, não em pixels independentes do dispositivo (DIPs), e são medidas em relação à área da janela do cliente. 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.

Sinalizadores adicionais

O parâmetro wParam contém um OR bit a bit de sinalizadores, indicando o estado dos outros botões do mouse mais as teclas SHIFT e CTRL.

Sinalizador Significado
MK_CONTROL A tecla CTRL está pressionada.
MK_LBUTTON O botão esquerdo do mouse está pressionado.
MK_MBUTTON O botão do meio do mouse está pressionado.
MK_RBUTTON O botão direito do mouse está pressionado.
MK_SHIFT A tecla SHIFT está pressionada.
MK_XBUTTON1 O botão XBUTTON1 está para baixo.
MK_XBUTTON2 O botão XBUTTON2 está para baixo.

 

A ausência de um sinalizador significa que o botão ou tecla correspondente não foi pressionado. Por exemplo, para testar se a tecla CTRL está para baixo:

if (wParam & MK_CONTROL) { ...

Se você precisar encontrar o estado de outras teclas além de CTRL e SHIFT, use a função GetKeyState que é descrita em entrado por teclado.

As mensagens da janela WM_XBUTTONDOWN e WM_XBUTTONUP se aplicam tanto ao XBUTTON1 quanto 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.
}

Clique duplo

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 registrar a classe de janela.

    WNDCLASS wc = { };
    wc.style = CS_DBLCLKS;

    /* Set other structure members. */

    RegisterClass(&wc);

Se você definir o sinalizador CS_DBLCLKS conforme mostrado, a janela receberá notificações de clique duplo. Um clique duplo é indicado por uma mensagem de janela com "DBLCLK" no nome. Por exemplo, um clique duplo no botão esquerdo do mouse produz a seguinte sequência de mensagens:

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

Na verdade, a segunda mensagem WM_LBUTTONDOWN que normalmente seria gerada, se torna uma mensagem WM_LBUTTONDBLCLK. Mensagens equivalentes são definidas para botões direito, meio e XBUTTON.

Até que você receba a mensagem de clique duplo, não há como saber 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 não cliente

Um conjunto separado de mensagens é definido para eventos de mouse que ocorrem dentro da área não cliente da janela. Essas 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 interceptará essas mensagens, pois a função DefWindowProc lida com 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ê manipular essas mensagens, geralmente deverá passá-las para DefWindowProc posteriormente. Caso contrário, seu aplicativo interromperá a funcionalidade padrão, como arrastar ou minimizar a janela.

Próximo

Movimento do mouse