Comment capturer mousemove événements sous contrôles enfants
Je suis en train de gérer un événement clic de souris sur une forme particulière qui doit se déclencher si le curseur de la souris se situe entre un ensemble de coordonnées - permet de dire un carré.
Je comprends que si j'avais une forme vide, je pourrais simplement de lier à l'événement mousemove et j'y vais. Mais en réalité, il peut y avoir jusqu'à 10 différents contrôles qui se chevauchent et dans mon appli de test de l'événement mousemove se déclenche uniquement si le curseur est sur la forme et non, si ses plus un enfant de contrôle.
Personne ne sait comment gérer cet événement lorsqu'il y a un nombre inconnu d'enfants contrôles au moment de la conception?
Est facile one-liner que je peux utiliser?
OriginalL'auteur Grant | 2009-11-12
Vous devez vous connecter pour publier un commentaire.
à mon humble avis il est un peu binaire de la situation ici : et il n'y a pas de "one-liner". la seule solution que je vois est d'obtenir vos contrôles qui ne sont pas de mettre en œuvre des événements dans un .NET récipient.
Lors de tout contrôle obtient un clic, le comportement attendu est que, il deviendra le Contrôle Actif de la Forme (ce qui peut toujours être accessible par cette.ActivceControl).
Mais, particulièrement si le contrôle que vous avez cliqué capture la souris, quelque chose doit déclencher un événement depuis .NET ne permet pas de mettre en œuvre l'événement "bouillonnement" (WPF).
La manière habituelle de traiter avec l'extension de comportement de n'importe quel objet qui est scellé ou tout ce qui est à écrire une extension de la méthode, et j'ai trouvé l'écriture d'extensions pour le Contrôle très facile, mais je ne sais pas si cela va vous aider dans ce cas. Malheureusement, je suis hors de mon pays d'origine, et n'ont pas de Visual Studio pour jouer avec.
Une stratégie que vous pouvez utiliser pour déterminer si un Point donné sur un Formulaire tombe dans les limites de tout Contrôle, il convient d'énumérer les domaines (Limites) de tous les contrôles du Formulaire par l'intermédiaire du 'forall des Formes de Contrôle.Collection (ce.Les contrôles). Mais, si vous avez des Commandes qui se chevauchent, vous avez alors la question de plus d'un contrôle contenant éventuellement un point donné.
meilleur, le projet de Loi
OriginalL'auteur BillW
essayez ceci:
Vous êtes correct Robert.
Oui je l'ai lu seulement après l'envoi de la réponse. Cela lui laisse la possibilité d'installer mondiale de la souris crochets.
Heureux que vous ne supprimez pas votre post si l'OP n'a envie de quelque chose d'autre. M'a aidé dans ma situation.
Merci beaucoup aidé. Peut changer de position relative comme le Point pt = e.Emplacement; Contrôle c = expéditeur de Contrôle; si (expéditeur != c') { // Boucle de cet enfant (ce) do { //Régler le point pour chaque conteneur parent pt.Offset(c.À gauche, c.Haut); c = c.Parent; } while (c != this); } MessageBox.Afficher(string.Format("X: {0}, Y:{1}", pt.X, pt.Y));
OriginalL'auteur TheVillageIdiot
Je sais que ce post est assez vieux, mais il me semble que la méthode la plus simple serait de la forme pour mettre en œuvre
IMessageFilter
. Dans le constructeur (ou dansOnHandleCreated
) vous appelezet puis vous pouvez intercepter les messages de toutes les fenêtres de la mise en œuvre de
IMessageFilter.PreFilterMessage
.Vous auriez probablement besoin d'utiliser P/Invoke pour WIN32 IsChild méthode
avec la forme du
Handle
de la propriété pour s'assurer que vous êtes la manipulation de la droite des messages.OriginalL'auteur stritch000
Pourquoi ne pas simplement utiliser la commande' mouseover gestionnaires d'événements?
OriginalL'auteur Robert Harvey
Je sais que je suis un peu en retard pour le coup de poing, mais j'ai eu des problèmes avec cela plus tôt aujourd'hui lors de l'utilisation d'un Panneau dans la barre de titre. J'avais une étiquette pour afficher un texte, une picturebox et quelques touches de imbriqué dans le Panneau, mais j'avais besoin pour intercepter l'événement MouseMove indépendamment.
Ce que j'ai décidé de faire était de mettre en œuvre une méthode récursive gestionnaire pour ce faire, comme je l'ai seulement eu 1 niveau d'imbrication des contrôles, ce qui peut évoluer pas trop bien quand vous commencer à approcher ridicule niveaux d'imbrication.
Voici comment je l'ai fait:
Et c'est relativement simple:
Définir votre "vrai" gestionnaire:
Et puis mettre en place le contrôle de l'événement abonnés:
Relativement simple à utiliser, et je peux attester du fait qu'il fonctionne 🙂
OriginalL'auteur Jason Larke