Partager via


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 :

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

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

Mouvement de la souris