Share via


Réponse 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 vers le bas
WM_LBUTTONUP Bouton gauche vers le haut
WM_MBUTTONDOWN Bouton central vers le bas
WM_MBUTTONUP Bouton central vers le haut
WM_RBUTTONDOWN Bouton droit vers le bas
WM_RBUTTONUP Bouton droit vers le haut
WM_XBUTTONDOWN XBUTTON1 ou XBUTTON2 vers le bas
WM_XBUTTONUP XBUTTON1 ou XBUTTON2 vers le haut

 

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, consultez 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 les plus bas 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 décompresser 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 64 bits. Les 32 bits supérieurs de lParam ne sont pas utilisés. La documentation MSDN mentionne le « mot de bas ordre » et le « mot d’ordre élevé » de lParam. Dans le cas 64 bits, cela signifie les mots d’ordre faible et élevé 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 données en pixels, et non en pixels indépendants de l’appareil (DIPs), et sont mesurées par rapport à la zone cliente de la fenêtre. Les coordonnées sont des valeurs signées. Les positions situées au-dessus et à gauche de la zone client ont des coordonnées négatives, ce qui est important si vous suivez la position de la souris à l’extérieur de la fenêtre. Nous verrons comment procéder dans une rubrique ultérieure, Capture du mouvement de la souris à l’extérieur de la fenêtre.

Indicateurs supplémentaires

Le paramètre wParam contient un OR au niveau du bit des indicateurs, indiquant l’état des autres boutons de la souris ainsi que les touches Maj 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 arrêté.
MK_SHIFT La touche MAJ est arrêtée.
MK_XBUTTON1 Le bouton XBUTTON1 est désactivé.
MK_XBUTTON2 Le bouton XBUTTON2 est désactivé.

 

L’absence d’indicateur signifie que le bouton ou la touche correspondante n’a pas été enfoncé. Par exemple, pour tester si la touche CTRL est enfoncée :

if (wParam & MK_CONTROL) { ...

Si vous devez rechercher l’état d’autres touches en plus de ctrl et maj, utilisez la fonction GetKeyState , qui est décrite dans Entrée du clavier.

Les messages de fenêtre WM_XBUTTONDOWN et WM_XBUTTONUP s’appliquent à XBUTTON1 et XBUTTON2. Le paramètre wParam indique le bouton sur lequel vous avez cliqué.

UINT button = GET_XBUTTON_WPARAM(wParam);  
if (button == XBUTTON1)
{
    // XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
    // XBUTTON2 was clicked.
}

Double-clic

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 inscrivez la classe window.

    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 reçoit des notifications de double-clic. Un double-clic est indiqué par un message de fenêtre avec « DBLCLK » dans le nom. Par exemple, un double-clic sur le bouton gauche de la souris génère la séquence de messages suivante :

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

En effet, le deuxième message WM_LBUTTONDOWN qui serait normalement généré devient un message WM_LBUTTONDBLCLK . Les messages équivalents sont définis pour les boutons droit, central et XBUTTON.

Tant que vous n’obtenez pas le message de double-clic, il n’existe aucun moyen de dire 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 par le premier clic de souris. Par exemple, dans Windows Shell, un simple clic 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 ont les lettres « NC » dans le nom. Par exemple, WM_NCLBUTTONDOWN est l’équivalent non client de WM_LBUTTONDOWN. Une application classique n’intercepte pas ces messages, car la fonction DefWindowProc gère ces messages correctement. Toutefois, ils peuvent être utiles pour certaines fonctions avancées. Par exemple, vous pouvez utiliser ces messages pour implémenter un comportement personnalisé dans la barre de titre. Si vous gérez ces messages, vous devez généralement les transmettre à DefWindowProc par la suite. Dans le cas contraire, votre application interrompt les fonctionnalités standard telles que le déplacement ou la réduction de la fenêtre.

Suivant

Mouvement de la souris