2009-09-22 8 views
5

un programme qui s'estompe lors d'un événement de sortie de souris.Mouse enter/leave Formulaire et bouton Problème des événements enfants

mais le problème est lorsque la souris entre dans un enfant de la forme comme un bouton, il déclenche l'événement de quitter la souris. donc j'ai mis en place ce code.

private void Form1_MouseLeave(object sender, EventArgs e) 
{ 
    if (this.ClientRectangle.Contains(this.PointToClient(Cursor.Position))) 
    { 
     this.Opacity = 1.0; 
    } 
    else 
    { 
     int loopctr = 0; 

     for (loopctr = 100; loopctr >= 5; loopctr -= 10) 
     { 
      this.Opacity = loopctr/99.0; 
      this.Refresh(); 
      Thread.Sleep(100); 
     } 
    } 
} 

mais le problème est maintenant que la forme ne souvent déclenche pas l'événement de congé de la souris, semble être parce que les boutons sont si proches de la forme des bords qu'il ne registrer que la souris a quitté les limites de la forme, probablement parce que le curseur de la souris est rapide et saute sur le formulaire quand il part.

Avez-vous des suggestions pour ce faire?

Répondre

2

Voici une simple classe utilitaire pour ce faire, d'abord l'utiliser dans votre formulaire comme ceci:

partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     new FadeForm(this, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(0.25), 0.05); 
    } 
} 

Ensuite, ajoutez ce code à votre projet:

class FadeForm 
{ 
    readonly Form _top; 
    readonly Timer _timer; 
    readonly TimeSpan _delayToFade; 
    readonly double _fadeAmount; 

    Control _lastControl; 
    DateTime _lastActivity; 

    public FadeForm(Form ctrl, TimeSpan delayToFade, TimeSpan delaySpeed, double fadeAmount) 
    { 
     _top = ctrl; 
     _delayToFade = delayToFade; 
     _fadeAmount = fadeAmount; 
     _lastActivity = DateTime.Now; 

     WatchControl(_top); 

     _timer = new Timer(); 
     _timer.Interval = (int)delaySpeed.TotalMilliseconds; 
     _timer.Enabled = true; 
     _timer.Tick += new EventHandler(Tick); 
    } 

    void Tick(object sender, EventArgs e) 
    { 
     if (_lastControl != null || (DateTime.Now - _lastActivity) < _delayToFade) 
     { 
      if (_top.Opacity != 1) 
       _top.Opacity = 1; 
     } 
     else 
     { 
      double newvalue = _top.Opacity -= _fadeAmount; 
      if (newvalue > 0.0) 
       _top.Opacity = newvalue; 
      else 
       _top.Close(); 
     } 
    } 

    void WatchControl(Control c) 
    { 
     c.MouseEnter += new EventHandler(MouseEnter); 
     c.MouseLeave += new EventHandler(MouseLeave); 
    } 

    void MouseEnter(object sender, EventArgs e) 
    { 
     _lastControl = sender as Control; 
    } 

    void MouseLeave(object sender, EventArgs e) 
    { 
     _lastControl = null; 
     _lastActivity = DateTime.Now; 
    } 
} 
0

Essayez événement Deactive de forme

+0

Je pense que cela ne se déclenche que lorsqu'une autre fenêtre devient active - pas quand la souris quitte le formulaire. – ChrisF

Questions connexes