Répondre aux clics de souris
Si l’utilisateur clique sur un bouton de la souris alors que le curseur se trouve sur la zone cliente d’une fenêtre, la fenêtre reçoit l’un des messages suivants.
Message | Signification |
---|---|
WM_LBUTTONDOWN | Bouton gauche enfoncé |
WM_LBUTTONUP | Bouton gauche relâché |
WM_MBUTTONDOWN | Bouton du milieu enfoncé |
WM_MBUTTONUP | Bouton du milieu relâché |
WM_RBUTTONDOWN | Bouton droit enfoncé |
WM_RBUTTONUP | Bouton droit relâché |
WM_XBUTTONDOWN | XBUTTON1 ou XBUTTON2 enfoncé |
WM_XBUTTONUP | XBUTTON1 ou XBUTTON2 relâché |
Rappelez-vous que la zone cliente est la partie de la fenêtre qui exclut le cadre. Pour plus d’informations sur les zones clientes, veuillez consulter la section Qu’est-ce qu’une fenêtre ?
Coordonnées de la souris
Dans tous ces messages, le paramètre lParam contient les coordonnées x et y du pointeur de la souris. Les 16 bits de poids faible de lParam contiennent la coordonnée x, et les 16 bits suivants contiennent la coordonnée y. Utilisez les macros GET_X_LPARAM et GET_Y_LPARAM pour extraire les coordonnées de lParam.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
Ces macros sont définies dans le fichier d’en-tête WindowsX.h.
Sur Windows 64 bits, lParam est une valeur de 64 bits. Les 32 bits supérieurs de lParam ne sont pas utilisés. Lorsque la documentation Windows mentionne le « mot de faible poids » et le « mot de poids fort » de lParam, dans le cas de 64 bits, cela signifie les mots de faible et de fort poids des 32 bits inférieurs. Les macros extraient les bonnes valeurs, donc si vous les utilisez, vous serez en sécurité.
Les coordonnées de la souris sont exprimées en pixels, et non en pixels indépendants du périphérique (DIPs), et sont mesurées par rapport à la zone cliente de la fenêtre. Les coordonnées sont des valeurs signées. Les positions au-dessus et à gauche de la zone cliente ont des coordonnées négatives, ce qui est important si vous suivez la position de la souris en dehors de la fenêtre. Nous verrons comment faire cela dans une rubrique ultérieure, Capturer le mouvement de la souris en dehors de la fenêtre.
Indicateurs supplémentaires
Le paramètre wParam contient un bitwise OR d’indicateurs, indiquant l’état des autres boutons de la souris ainsi que des touches SHIFT et CTRL.
Indicateur | Signification |
---|---|
MK_CONTROL | La touche CTRL est enfoncée. |
MK_LBUTTON | Le bouton gauche de la souris est enfoncé. |
MK_MBUTTON | Le bouton central de la souris est enfoncé. |
MK_RBUTTON | Le bouton droit de la souris est enfoncé. |
MK_SHIFT | La touche MAJ est enfoncée. |
MK_XBUTTON1 | Le bouton XBUTTON1 est enfoncé. |
MK_XBUTTON2 | Le bouton XBUTTON2 est enfoncé. |
Par exemple, pour tester si la touche CTRL est enfoncée : L’absence d’un indicateur signifie que le bouton ou la touche correspondant n’a pas été enfoncé.
if (wParam & MK_CONTROL) { ...
Si vous avez besoin de connaître l’état d’autres touches en plus de CTRL et SHIFT, utilisez la fonction GetKeyState, qui est décrite dans Saisie au clavier.
Les messages de fenêtre WM_XBUTTONDOWN et WM_XBUTTONUP s’appliquent à la fois aux boutons XBUTTON1 et XBUTTON2. Le paramètre wParam indique quel bouton a été cliqué.
UINT button = GET_XBUTTON_WPARAM(wParam);
if (button == XBUTTON1)
{
// XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
// XBUTTON2 was clicked.
}
Double-clics
Une fenêtre ne reçoit pas de notifications de double-clic par défaut. Pour recevoir des double-clics, définissez l’indicateur CS_DBLCLKS dans la structure WNDCLASS lorsque vous enregistrez la classe de fenêtre.
WNDCLASS wc = { };
wc.style = CS_DBLCLKS;
/* Set other structure members. */
RegisterClass(&wc);
Si vous définissez l’indicateur CS_DBLCLKS comme indiqué, la fenêtre recevra des notifications de double-clic. Un double-clic est indiqué par un message de fenêtre contenant « DBLCLK » dans le nom. Par exemple, un double-clic sur le bouton gauche de la souris produit la séquence de messages suivante :
En effet, le second message WM_LBUTTONDOWN qui serait normalement généré devient un message WM_LBUTTONDBLCLK. Des messages équivalents sont définis pour les boutons droit, milieu et XBUTTON.
Jusqu’à ce que vous receviez le message de double-clic, il n’y a aucun moyen de savoir que le premier clic de souris est le début d’un double-clic. Par conséquent, une action de double-clic doit continuer une action qui commence avec le premier clic de souris. Par exemple, dans l’Explorateur Windows, un clic simple sélectionne un dossier, tandis qu’un double-clic ouvre le dossier.
Messages de souris non-client
Un ensemble distinct de messages est défini pour les événements de souris qui se produisent dans la zone non cliente de la fenêtre. Ces messages contiennent les lettres « NC » dans le nom. Par exemple, WM_NCLBUTTONDOWN est l’équivalent non-client de WM_LBUTTONDOWN. Une application typique n’interceptera pas ces messages, car la fonction DefWindowProc gère correctement ces messages. Cependant, ils peuvent être utiles pour certaines fonctions avancées. Par exemple, vous pourriez utiliser ces messages pour implémenter un comportement personnalisé dans la barre de titre. Si vous gérez ces messages, vous devriez généralement les transmettre à DefWindowProc par la suite. Sinon, votre application rompra des fonctionnalités standard telles que le glissement ou la minimisation de la fenêtre.
Next