La détection d'un simple clic de souris sur MFC
Dans MFC un double-clic de la souris événement déclenche la séquence suivante de messages
- WM_LBUTTONDOWN
- WM_LBUTTONUP
- WM_LBUTTONDBCLK
- WM_LBUTTONUP
Afin de répondre à la WM_LBUTTONDBCLK message vous permet de détecter un double-clic. Mais si je veux juste pour détecter un simple clic, comment les distinguer?
Mais simplement en regardant la WM_LBUTTONUP message n'est pas assez car il pourrait être un simple clic, ou il pourrait être le premier clic d'un double-clic.
Comment puis-je réussir à identifier un seul clic?
OriginalL'auteur Matt Warren | 2009-02-03
Vous devez vous connecter pour publier un commentaire.
(Permettez-moi d'appeler ces événements de la Souris et de la Souris vers le Bas. Ma MFC est un peu rouillé. Et il y a ce truc appelé .NET qui a été gâcher mon terminologie dernièrement 😉
Histoire courte: Vous ne voulez simplement savoir à propos de Clic de Souris. Vous avez besoin de plus.
Longue histoire:
Bien que c'est contre-intuitif, il semble que voulant simplement un clic de souris est assez rare. Le plus souvent, vous aurez envie d'effectuer certaines opérations sur la Souris vers le Bas et faire un traitement ultérieur sur la Souris. Le truc, c'est que le simple suivi de la Souris en Haut de messages n'est pas suffisant: la Souris vers le Bas peut ne pas avoir été dans votre fenêtre. Considérez-vous qu'il valide cliquez ensuite? Surtout en considérant que le bouton de la Souris de traitement (telles que la sélection d'un élément) n'a pas eu lieu.
D'aller plus loin dans le raisonnement, vous ne devez pas compter sur la réception d'une Souris après avoir traité de la Souris vers le Bas: l'Utilisateur peut avoir déplacé la souris et relâché le bouton quelque part d'autre (pensez drag'n'drop), dans ce cas, vous ne recevez pas l'événement MouseUp... à moins de capture de la souris sur MouseDown pour vous assurer d'obtenir événement de souris jusqu'à la Souris, même si la souris à gauche de votre fenêtre.
Dans l'ensemble, vous vous retrouvez le suivi de la Souris vers le Bas, la capture de la souris et quand vous recevez de la Souris, il suffit de vérifier si vous possédez la capture. Si non, la souris a double-cliqué (pas de 2ème de la souris vers le bas) ou de la Souris vers le Bas est arrivé quelque part d'autre où vous avez très probablement ne se soucient pas de cette Souris.
En conclusion: Il n'y a pas de message de Clic de souris, simplement parce que vous ne voudriez pas aller très loin avec elle: Vous avez besoin de gérer plus de messages et de mettre en œuvre plus de la mécanique, de toute façon.
Oh! Et si votre affaire avec un contrôle existant qui prend en charge tous les articles et sélection de choses, comme une listview, les chances sont qu'il fournit avec une coutume de ce genre de notification comme Élément de l'Activer ou de la Sélection de l'Élément a Changé.
OriginalL'auteur Serge Wautier
J'ai juste essayé ce en Delphi, le comportement est le même: même quand un double clic qui se passe, un événement de clic est émis juste après le premier des deux.
Je l'ai résolu en utilisant une minuterie, qui fonctionne comme ceci:
bDbl
àtrue
)bDbl==false
bDbl==true
(et réinitialiserbDbl
)J'ai mis l'intervalle de la minuterie pour le temps retourné par
GetDoubleClickTime
.MSDN dit:
Si la minuterie arrive à feu, alors vous avez le véritable déclic. Dans mon cas, le double cliquez sur l'intervalle est de 500ms, de sorte que tout "réel cliquez sur" seront en retard cette longue.
OriginalL'auteur Heinrich Ulbricht
Vous pouvez le vérifier WM_LBUTTONDOWN n'a pas été appelé plus d'une fois avant de WM_LBUTTONUP. Dans la pratique, Windows ne pour vous, que si vous obtenez un WM_LBUTTONDBCLK vous avez tendance à ne pas obtenir un WM_LBUTTONUP.
OriginalL'auteur SmacL
Vous pouvez utiliser PreTranslateMessage() pour compter les messages tels qu'ils apparaissent. Si vous avez reçu uniquement la souris messages correspondant à un simple clic, et le système de temps configuré pour double-cliquant sur a expiré, vous pouvez supposer qu'il s'agit d'un simple clic.
Autant que je sache, il n'y a aucun moyen de savoir que c'est le cas, comme c'est le cas, ce qui est logique, -- jusqu'à ce que le temps est expiré, il n'y a aucun moyen de savoir que vous cliquez une deuxième qui est ou n'est pas venue.
OriginalL'auteur mwigdahl
c'est un peu délicat.
Je détecter la WM_LBUTTONDOWN & WM_LBUTTONUP combo, magasin de cet événement quelque part et de définir un délai d'attente pour une seconde ou deux. Si il n'y a pas un WM_LBUTTONDBCLK pendant ce délai d'attente, alors vous avez un seul clic.
Cela peut impliquer que vous devez avoir un autre thread en cours d'exécution, mais je pense que vous pourriez faire avec un seul thread.
OriginalL'auteur cbrulak
Je pense que la solution est de démarrer une minuterie après le premier clic & puis vérifier le temps écoulé après le prochain clic, cela vous dira si c'est un simple clic ou double-clic.
OriginalL'auteur Arjun
Généralement, vous regardez @MLButtonUp et vous n'auriez pas seul clic et double-cliquez sur le comportement sur le même bouton de la souris.
OriginalL'auteur Aaron Fischer