2010-01-06 9 views
7

J'ai une sous-classe Form avec des gestionnaires pour MouseHover et MouseLeave. Lorsque le pointeur est sur le fond de la fenêtre, les événements fonctionnent bien, mais lorsque le pointeur se déplace sur un contrôle à l'intérieur de la fenêtre, il provoque un événement MouseLeave.Événement MouseHover/MouseLeave sur l'ensemble de la fenêtre

Y a-t-il un événement qui couvre toute la fenêtre?

(.NET 2.0, Visual Studio 2005, Windows XP.)

Répondre

6

Lorsque l'événement congé de la souris est tiré d'une option est de vérifier la position actuelle du pointeur et voir si elle dans la zone de formulaire. Je ne suis pas sûr qu'une meilleure option soit disponible. Edit: Nous avons une question similaire qui pourrait vous intéresser. How to detect if the mouse is inside the whole form and child controls in C#?

+0

Donc, si j'enregistrer le même gestionnaire pour MouseEnter et MouseLeave pour * tous * contrôles à l'intérieur d'une fenêtre (y compris à l'intérieur des panneaux), puis ce gestionnaire vérifier la position de la souris pour détecter un changement d'intérieur/extérieur et appeler le "vrai" entrer/quitter gestionnaire. Bonne idée, merci. – billpg

+0

J'ai ajouté un exemple d'utilisation d'un seul événement MouseEnter et MouseLeave pour le formulaire entier. Faites-moi savoir si cela fonctionne pour vous – SwDevMan81

+0

Bonne idée. Mais si le contrôle contenu est sur la bordure, cela ne fonctionnera pas. (Donnez crédit [ici] (http://stackoverflow.com/a/19361582/939213) à l'utilisateur qui l'a remarqué.) – ispiro

5

Il n'y a pas de bonne façon de faire MouseLeave fiable pour un contrôle conteneur. Punt ce problème avec une minuterie:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     timer1.Interval = 200; 
     timer1.Tick += new EventHandler(timer1_Tick); 
     timer1.Enabled = true; 
    } 

    private bool mEntered; 

    void timer1_Tick(object sender, EventArgs e) { 
     Point pos = this.PointToClient(Cursor.Position); 
     bool entered = this.ClientRectangle.Contains(pos); 
     if (entered != mEntered) { 
      mEntered = entered; 
      if (!entered) { 
       // Do your leave stuff 
       //... 
      } 
     } 
    } 
} 
0

Sur votre contrôle utilisateur Créer un événement MouseHover pour votre contrôle comme celui-ci, (ou tout autre type d'événement) comme celui-ci

private void picBoxThumb_MouseHover(object sender, EventArgs e) 
{ 
    // Call Parent OnMouseHover Event 
    OnMouseHover(EventArgs.Empty); 
} 

Sur votre WinForm qui accueille UserControl cette pour le UserControl pour gérer la MouseOver donc placer dans votre Designer.cs

this.thumbImage1.MouseHover += new System.EventHandler(this.ThumbnailMouseHover); 

qui appelle cette méthode sur votre WinForm

private void ThumbnailMouseHover(object sender, EventArgs e) 
{ 

    ThumbImage thumb = (ThumbImage) sender; 

} 

Où ThumbImage est le type de usercontrol

8

Ovveride l'événement MouseLeave de ne pas déclencher tant que la souris entre un contrôle enfant

protected override void OnMouseLeave(EventArgs e) 
    { 
     if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition))) 
      return; 
     else 
     { 
      base.OnMouseLeave(e); 
     } 
    } 
Questions connexes