2009-09-22 7 views
5

एक ऐसा प्रोग्राम है जो माउस छोड़ने की घटना पर बाहर निकलता है।माउस दर्ज करें/छोड़ें फॉर्म और बटन बाल घटनाओं की समस्या

लेकिन समस्या तब होती है जब माउस बटन के रूप में फ़ॉर्म के बच्चे में जाता है, यह माउस छोड़ने की घटना को ट्रिगर करता है। तो मैंने यह कोड स्थापित किया।

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

लेकिन समस्या यह है कि फार्म अक्सर माउस छुट्टी घटना ट्रिगर नहीं होता, हो सकता है क्योंकि बटन इतने करीब के रूप किनारों कि यह registrer कभी नहीं है कि माउस प्रपत्र सीमाओं छोड़ दिया जाता लग रहा है शायद क्योंकि माउस कर्सर तेजी से होता है और जब यह छोड़ देता है तो फॉर्म पर छोड़ देता है।

इसे कैसे संभालें इस पर कोई सुझाव?

उत्तर

2

यहाँ, यह करने के लिए एक सरल उपयोगिता वर्ग है पहली बार इस तरह अपने रूप में इसका इस्तेमाल करते हैं:

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

तो अपनी परियोजना के लिए इस कोड जोड़ें:

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

फार्म के अक्रिय घटना की कोशिश करो इसके बजाय

+0

मुझे लगता है कि यह केवल तभी आग लगती है जब कोई अन्य विंडो सक्रिय हो जाती है - जब माउस फॉर्म को छोड़ देता है। – ChrisF

संबंधित मुद्दे