2010-01-06 17 views
7

मेरे पास MouseHover और MouseLeave के लिए हैंडलर के साथ फॉर्म सबक्लास है। जब पॉइंटर विंडो की पृष्ठभूमि पर होता है, तो ईवेंट ठीक काम करते हैं, लेकिन जब सूचक पर विंडो के अंदर नियंत्रण पर चलता है, तो यह MouseLeave ईवेंट का कारण बनता है।पूरे पूरे विंडो पर माउसहोवर/माउसलेव घटना

क्या कोई भी खिड़की पूरी खिड़की को कवर करने के लिए है।

(.NET 2.0, विजुअल स्टूडियो 2005, Windows XP।)

उत्तर

6

जब माउस छुट्टी घटना एक ही विकल्प निकाल दिया जाता है सूचक की वर्तमान स्थिति के लिए जाँच करें और प्रपत्र क्षेत्र के भीतर अगर यह देखने के लिए है। मुझे यकीन नहीं है कि एक बेहतर विकल्प उपलब्ध है या नहीं।

संपादित करें: हमारे पास एक समान प्रश्न है जो आपके लिए रूचिपूर्ण हो सकता है। How to detect if the mouse is inside the whole form and child controls in C#?

+0

तो एक बच्चे को नियंत्रण में प्रवेश करती है अगर मैं mouseenter और mouseleave के लिए के लिए एक ही हैंडलर रजिस्टर ट्रिगर नहीं करने के लिए * सभी * एक खिड़की के अंदर नियंत्रण (अंदर पैनलों सहित), तो उस हैंडलर को अंदर/बाहर के परिवर्तन का पता लगाने के लिए माउस स्थिति की जांच करें और "वास्तविक" प्रविष्टि/छोड़ने वाले हैंडलर को कॉल करें। अच्छा विचार, धन्यवाद। – billpg

+0

मैंने पूरे फॉर्म के लिए केवल एक माउसइंटर और माउसलेव ईवेंट का उपयोग करने का एक उदाहरण जोड़ा। मुझे बताएं कि क्या यह आपके लिए काम करता है – SwDevMan81

+0

अच्छा विचार। लेकिन यदि निहित नियंत्रण सीमा पर है तो यह काम नहीं करेगा। (क्रेडिट [यहां] (http://stackoverflow.com/a/19361582/939213) को उस उपयोगकर्ता को दें जिसने इसे देखा है।) – ispiro

5

एक कंटेनर नियंत्रण के लिए mouseleave विश्वसनीय बनाने के लिए कोई अच्छा तरीका नहीं है। एक टाइमर के साथ इस समस्या पंट:

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

आपके उपयोगकर्ता नियंत्रण पर इस

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

अपने WinForm जो UserControl को होस्ट पर जैसे इस तरह अपने नियंत्रण, (या अन्य घटना प्रकार) के लिए एक mousehover इवेंट बनाने UserControl माउसओवर संभाल करने के लिए इस राशि तो अपने Designer.cs

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

जो आपके WinForm पर इस विधि कॉल में रखें

private void ThumbnailMouseHover(object sender, EventArgs e) 
{ 

    ThumbImage thumb = (ThumbImage) sender; 

} 

कहाँ ThumbImage usercontrol

8

mouseleave घटना Ovveride के प्रकार है जब तक कि माउस

protected override void OnMouseLeave(EventArgs e) 
    { 
     if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition))) 
      return; 
     else 
     { 
      base.OnMouseLeave(e); 
     } 
    } 
संबंधित मुद्दे