Comment détecter un bouton de souris enfoncé sur un PictureBox?
-
05-07-2019 - |
Question
Je dois déclencher un événement lorsque la souris est au-dessus d'un PictureBox avec le bouton de la souris déjà cliqué et maintenu enfoncé.
Problèmes:
Les gestionnaires d'événements MouseDown et MouseEnter ne fonctionnent pas très bien ensemble.
Par exemple, lorsque vous cliquez sur un bouton de la souris et que vous le maintenez enfoncé, C # déclenche le gestionnaire d'événements MouseDown, mais lorsque le curseur se déplace sur le PictureBox, l'événement MouseEnter ne se déclenche pas jusqu'à ce que le bouton de la souris soit libéré. ??
La solution
Lorsque la souris est enfoncée, la plupart des contrôles sont ensuite Control.Capture . Cela signifie que tous les événements MouseMove sont envoyés au contrôle d'origine qui a été capturé plutôt qu'au contrôle sur lequel se trouve la souris. Cela continue jusqu'à ce que la souris perde la capture, ce qui se produit généralement lorsque la souris se lève.
Si vous avez vraiment besoin de savoir quand la souris survole votre contrôle, même si un autre contrôle a capturé l'entrée de la souris, vous ne pouvez réellement utiliser qu'un seul moyen. Vous devez surveiller les messages Windows destinés aux autres contrôles de votre application. Pour ce faire, vous devez ajouter un filtre de message ...
Application.AddMessageFilter(myFilterClassInstance);
Ensuite, vous devez implémenter IMessageFilter sur une classe appropriée ...
public class MyFilterClass : IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_MOUSEMOVE)
// Check if mouse is over my picture box!
return false;
}
}
Ensuite, vous surveillez les événements de déplacement de la souris, vérifiez s’ils se trouvent au-dessus de votre boîte à images et faites ce que vous voulez.
Autres conseils
Événements de souris
Utilisez l’événement MouseDown pour détecter une simple pression du bouton de la souris et définissez this.Capture sur true afin d’obtenir d’autres événements de souris, même lorsque la souris quitte le contrôle (c’est-à-dire que vous ne recevez pas un événement MouseLeave parce que vous avez capturé la souris). Libérez la capture en définissant this.Capture sur false lorsque MouseUp est activé.
Vérification de l'état de la souris
Cela peut ne pas être pertinent, mais vous pouvez vérifier System.Windows.Control.MousePosition
et voir s'il se trouve dans le PictureBox.ClientRectangle
, puis vérifier le Control.MouseButtons
propriété statique pour laquelle les boutons peuvent être désactivés à tout moment.
Comme dans:
if (pictureBox.ClientRectangle.Contains(pictureBox.PointToClient(Control.MousePosition)))
{
if ((Control.MouseButtons & MouseButtons.Left) != 0)
{
// Left button is down.
}
}
Configurez un événement MouseMove dans le contrôle PictureBox:
this.myPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.myPictureBox_MouseMove);
Ensuite, dans votre gestionnaire d'événements MouseMove, vérifiez si le bouton gauche de la souris (ou autre) est enfoncé:
private void myPictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
// Do what you want to do
}
Si vous essayez d'implémenter une opération de glisser-déposer, les événements Drag ... (DragEnter, DragDrop, etc.) de la zone d'image de réception sont ceux que vous souhaitez. utiliser. Fondamentalement, vous démarrez l'opération de glisser à l'aide de la méthode DoDragDrop du contrôle source, puis tous les contrôles sur lesquels vous faites glisser verront leurs événements Drag ... déclenchés.
Recherche " DoDragDrop " sur MSDN pour voir comment implémenter cela.
La meilleure façon de déplacer un formulaire en fonction de la position de la souris et du contrôle de la position relative est similaire à celle publiée par Ian Campbell.
private void imgMoveWindow_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Form1.ActiveForm.Left = Control.MousePosition.X - imgMoveWindow.Left - (imgMoveWindow.Size.Width/2);
Form1.ActiveForm.Top = Control.MousePosition.Y - imgMoveWindow.Top - (imgMoveWindow.Size.Height/2);
}
}
Où imgMoveWindow est un contrôle PictureBox.
Bruno Ratnieks
Réseaux de renifleurs
définir un drapeau ou un état souris vers le bas. relâchez-le avec la souris. Lorsque vous passez la souris sur les feux pour la zone d'image, vérifiez votre état. Vous pouvez maintenant détecter quand une personne fait glisser quelque chose.