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é. ??

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top