Risposta ai clic del mouse
Se l'utente fa clic su un pulsante del mouse mentre il cursore si trova sull'area client di una finestra, la finestra riceve uno dei messaggi seguenti.
Message | Significato |
---|---|
WM_LBUTTONDOWN | Pulsante sinistro verso il basso |
WM_LBUTTONUP | Pulsante sinistro verso l'alto |
WM_MBUTTONDOWN | Pulsante centrale verso il basso |
WM_MBUTTONUP | Pulsante centrale su |
WM_RBUTTONDOWN | Pulsante destro verso il basso |
WM_RBUTTONUP | Pulsante destro su |
WM_XBUTTONDOWN | XBUTTON1 o XBUTTON2 inattivo |
WM_XBUTTONUP | XBUTTON1 o XBUTTON2 |
Tenere presente che l'area client è la parte della finestra che esclude il frame. Per altre informazioni sulle aree client, vedere Che cos'è una finestra?
Coordinate del mouse
In tutti questi messaggi, il parametro lParam contiene le coordinate x e y del puntatore del mouse. I 16 bit più bassi di lParam contengono la coordinata x e i 16 bit successivi contengono la coordinata y. Utilizzare le macro GET_X_LPARAM e GET_Y_LPARAM per decomprimere le coordinate da lParam.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
Queste macro sono definite nel file di intestazione WindowsX.h.
In Windows a 64 bit, lParam è un valore a 64 bit. I 32 bit superiori di lParam non vengono usati. Dove la documentazione di Windows indica la parola "parola in ordine basso" e "parola di ordine elevato" di lParam, il caso a 64 bit indica le parole in ordine basso e alto dei 32 bit inferiori. Le macro estraggono i valori corretti, quindi se li usi, sarai sicuro.
Le coordinate del mouse vengono fornite in pixel, non in pixel indipendenti dal dispositivo (DIP) e vengono misurate in relazione all'area client della finestra. Le coordinate sono valori firmati. Le posizioni sopra e a sinistra dell'area client hanno coordinate negative, che è importante se si tiene traccia della posizione del mouse all'esterno della finestra. Vedremo come eseguire questa operazione in un argomento successivo, Acquisizione del movimento del mouse all'esterno della finestra.
Flag aggiuntivi
Il parametro wParam contiene un OR bit per bit di flag, che indica lo stato degli altri pulsanti del mouse più i tasti MAIUSC e CTRL.
Flag | significato |
---|---|
MK_CONTROL | Il tasto CTRL è inattivo. |
MK_LBUTTON | Il pulsante sinistro del mouse è in basso. |
MK_MBUTTON | Il pulsante centrale del mouse è in basso. |
MK_RBUTTON | Il pulsante destro del mouse è in basso. |
MK_SHIFT | Il tasto MAIUSC è inattivo. |
MK_XBUTTON1 | Il pulsante XBUTTON1 è inattivo. |
MK_XBUTTON2 | Il pulsante XBUTTON2 è inattivo. |
L'assenza di un flag indica che il pulsante o il tasto corrispondente non è stato premuto. Ad esempio, per verificare se il tasto CTRL è inattivo:
if (wParam & MK_CONTROL) { ...
Se è necessario trovare lo stato di altri tasti oltre a CTRL e MAIUSC, usare la funzione GetKeyState , descritta in Input da tastiera.
I messaggi della finestra di WM_XBUTTONDOWN e di WM_XBUTTONUP si applicano sia a XBUTTON1 che a XBUTTON2. Il parametro wParam indica il pulsante su cui è stato fatto clic.
UINT button = GET_XBUTTON_WPARAM(wParam);
if (button == XBUTTON1)
{
// XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
// XBUTTON2 was clicked.
}
Doppio clic
Una finestra non riceve notifiche con doppio clic per impostazione predefinita. Per ricevere doppio clic, impostare il flag CS_DBLCLKS nella struttura WNDCLASS quando si registra la classe della finestra.
WNDCLASS wc = { };
wc.style = CS_DBLCLKS;
/* Set other structure members. */
RegisterClass(&wc);
Se si imposta il flag CS_DBLCLKS come illustrato, la finestra riceverà notifiche con doppio clic. Un doppio clic è indicato da un messaggio di finestra con "DBLCLK" nel nome. Ad esempio, un doppio clic sul pulsante sinistro del mouse produce la sequenza di messaggi seguente:
In effetti, il secondo messaggio WM_LBUTTONDOWN che normalmente viene generato diventa un messaggio di WM_LBUTTONDBLCLK. I messaggi equivalenti vengono definiti per i pulsanti destra, centrale e XBUTTON.
Finché non viene visualizzato il messaggio di doppio clic, non c'è modo di indicare che il primo clic del mouse è l'inizio di un doppio clic. Pertanto, un'azione di doppio clic deve continuare un'azione che inizia con il primo clic del mouse. Ad esempio, nella shell di Windows, un singolo clic seleziona una cartella, mentre un doppio clic apre la cartella.
Messaggi del mouse non client
Un set separato di messaggi viene definito per gli eventi del mouse che si verificano all'interno dell'area non client della finestra. Questi messaggi hanno le lettere "NC" nel nome. Ad esempio, WM_NCLBUTTONDOWN è l'equivalente non client di WM_LBUTTONDOWN. Un'applicazione tipica non intercetta questi messaggi, perché la funzione DefWindowProc gestisce correttamente questi messaggi. Tuttavia, possono essere utili per determinate funzioni avanzate. Ad esempio, è possibile usare questi messaggi per implementare un comportamento personalizzato nella barra del titolo. Se si gestiscono questi messaggi, in genere è consigliabile passarli a DefWindowProc in un secondo momento. In caso contrario, l'applicazione interromperà le funzionalità standard, ad esempio trascinando o riducendo al minimo la finestra.
Avanti