2012-09-20 12 views
10

की सीमा के भीतर है मैं एक उपयोगकर्ता नियंत्रणनहीं मिलती है तो कर्सर एक नियंत्रण

public partial class UserControl1 : UserControl, IMessageFilter 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) 
    { 
     var mouseLocation = Cursor.Position; 

     if (Bounds.Contains(PointToClient(mouseLocation))) 
     { 
      bool aBool = true;//breakpoint 
      bool two = aBool;//just assignment so compiler doesn't optimize my bool out 
     } 
     if (m.Msg != 0x20a) // Scrolling Message 
     { 
      return false;//ignore message 
     } 
     return false; 
    } 
} 

है जब मैं एक माता पिता के रूप में निहित उपयोगकर्ता नियंत्रण अपने हाथ में तैरने लगते हैं, ब्रेकपाइंट मारा नहीं है। ब्रेकपॉइंट निकट निकटता में मारा जाता है, लेकिन मैं उपयोगकर्ता नियंत्रण के अंदर एक वास्तविक टेक्स्टबॉक्स में हो सकता हूं और हिट नहीं कर सकता। मैं इस उपयोगकर्ता नियंत्रण की सीमाओं के भीतर सटीक रूप से निर्धारित कैसे कर सकता हूं?

एफडब्ल्यूआईडब्ल्यू, मेरे पास दो मॉनीटर हैं। ऐसा लगता है कि मैं जिस मॉनीटर का उपयोग कर रहा हूं उसमें कोई अंतर नहीं दिखता है।

+0

[WinForm नियंत्रण अपने हाथ में कर्सर (ग #, WinForm 4.0)] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/5620276/cursor-over-winform-control-c-winform-4-0) –

+0

@ डैनियलए। व्हाइट आपके लिंक में जो जवाब मैं देखता हूं वह एक ही नियंत्रण के लिए विशिष्ट है। ध्यान दें कि यहां मैं वैश्विक संदेश फ़िल्टर में शामिल हूं। मुझे नहीं लगता कि वे काम करेंगे। आखिर में मुझे यह जानने की ज़रूरत है कि माउस पर नियंत्रण कौन सा नियंत्रण है, न केवल सामान्य उपयोगकर्ता नियंत्रण जिसमें बाल नियंत्रण शामिल है। –

उत्तर

39

Control.ClientRectangle बजाय Control.Bounds के खिलाफ अपने हिट परीक्षण का प्रयास करें:

if (ClientRectangle.Contains(PointToClient(Control.MousePosition))) { 
    bool aBool = true;//breakpoint 
    bool two = aBool; 
} 
+0

यदि यह 'MouseEventArgs' से है, तो आप' PointToClient' के बिना, उस स्थान से 'स्थान' प्रॉपर्टी भी ले सकते हैं। – Nyerguds

-2

बस तेज़ चाल के लिए, आप एक ईवेंट के साथ सभी उपयोगकर्ता नियंत्रण नियंत्रण को ट्रिगर कर सकते हैं और माउस को ईवेंट पर संभाल सकते हैं। उदाहरण के लिए यदि आप अपने usercontrol में दो पाठ बॉक्स था

textBox1.MouseMove += new MouseEventHandler(controls_MouseMove); 
    textBox2.MouseMove += new MouseEventHandler(controls_MouseMove); 
    ... 

    void controls_MouseMove(object sender, MouseEventArgs e) 
    { 
     Control subc=sender as Control; 
     int mouseX = MousePosition.X; 
     .... 
    } 
+0

इस बात को ध्यान में रखें कि कम से कम कुछ नियंत्रण माउस-डाउन ईवेंट प्राप्त करते समय mousemove ईवेंट को आग लगाते हैं। इससे निपटने के लिए सबसे अच्छा तरीका यह है कि माउस चालक के ईवेंट हैंडलर के भीतर दोबारा जांच करना है कि माउस पॉइंटर वास्तव में नियंत्रण से बाहर है या नहीं। – xDisruptor

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