2009-09-22 6 views
5

haben ein Programm, das bei Maus verlassen Ereignis ausblendet.Maus eingeben/verlassen Formular und Button Kind Ereignisse Problem

aber das Problem ist, wenn die Maus in ein Kind des Formulars wie ein Button geht, löst es das Maus verlassen Ereignis aus. Also habe ich diesen Code eingerichtet.

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); 
     } 
    } 
} 

aber das Problem ist jetzt, dass die Form oft nicht die Maus verlassen Ereignis auslöst, sieht da die Tasten auf die Form so nahe sein Kanten, dass es nie Registrer, dass die Maus, um die Form Grenzen verlassen, wahrscheinlich weil der Mauszeiger zu schnell ist und beim Verlassen des Formulars überspringt.

irgendwelche Vorschläge, wie man das handhabt?

Antwort

2

Hier ist eine einfache Utility-Klasse, dies zu tun, ist es zunächst wie dies in Ihrem Formular:

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

Dann diesen Code zu Ihrem Projekt hinzufügen:

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

deactive Fall Form Versuchen stattdessen

+0

Ich denke, das wird nur ausgelöst, wenn ein anderes Fenster aktiv wird - nicht wenn die Maus das Formular verlässt. – ChrisF