2011-05-05 17 views
5

पर "हॉट ट्रैक" प्रभाव उपयोगकर्ता नियंत्रण को लागू करने का सबसे आसान तरीका क्या है जो माउस के ऊपर घूमते समय अपने आस-पास की सीमा को खींचने के "हॉट ट्रैक" प्रभाव की नकल करता है?विंडोज फॉर्म UserControl

मैं असफल कि OnMouseHover घटना है कि सीमा ड्रॉ ओवरराइड करता है एक कस्टम नियंत्रण के वारिस की कोशिश की है (जैसे कि गतिविधि सक्रिय किया जा रहा है ऐसा लगता है)

धन्यवाद!

उत्तर

2

आप अपने यूसी में ध्यान से रखे पैनल नियंत्रण का उपयोग करके और निम्न स्तर के विंडोज संदेशों की निगरानी करके माउस की स्थिति का उपयोग करके अपने उपयोगकर्ता नियंत्रण के चारों ओर एक सीमा की उपस्थिति का अनुकरण कर सकते हैं।

उपयोगकर्ता नियंत्रण डिजाइन सतह पर एक पैनल जोड़ें और पैनल को आकार दें ताकि यूसी की डिजाइन सतह का केवल एक छोटा सा हिस्सा दिखाई दे (दिखाई दें * नीचे देखें)। डिजाइन सतह का दृश्य भाग आपकी रंगीन सीमा होने जा रहा है, इसलिए तदनुसार इसकी 'मोटाई' सेट करें। पैनल में अपने यूसी लिखने वाले अन्य नियंत्रण जोड़ें।

आपका नियंत्रण इस प्रकार दिखाई देंगे:
enter image description here

अपने यूसी में IMessageFilter इंटरफेस को लागू करें। PreFilterMessage() के कार्यान्वयन में आप यूसी के सापेक्ष माउस की स्थिति की जांच करेंगे और यूसी के बैककोलर को अपने सीमा रंग में सेट करेंगे जब माउस यूसी पर हो, या जब यह डिफ़ॉल्ट रंग पर वापस न हो। चूंकि पैनल का बैककोलर नहीं बदलता है, यह आपके यूसी आह की तरह उपयोगकर्ता को दिखाई देगा।

यहाँ आप ऐसा करने के लिए की आवश्यकता होगी कोड की न्यूनतम राशि है:

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

    public bool PreFilterMessage(ref Message m) { 
     if (!this.IsDisposed && this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition))) { 
      this.BackColor = Color.Green; // Or whatever border color you want. 
     } else { 
      this.BackColor = SystemColors.Control; // Back to the UC's default border color. 
     } 
     return false; 
    } 
} 

नोट: जब मैं इस परीक्षण किया मैं कठिनाई पारदर्शी नहीं होने के लिए की स्थापना मेरी पैनल के BackColor हो रही थी। मैंने डिजाइनर में अस्थायी रूप से बैककॉलर को एक अलग रंग में बदलकर और फिर इसे अपने डिफ़ॉल्ट रंग (नियंत्रण) में बदलकर तय किया।

+0

धन्यवाद! यही वह है जिसकी तलाश में मैं हूं। – Gerard

+0

मैंने देखा है कि यदि एक फॉर्म के ऊपर एक मोडल फॉर्म खोला गया है तो प्रीफिल्टर मैसेज अभी भी नीचे दिए गए फॉर्म पर निष्पादित है ... क्या इसे पकड़ने का कोई तरीका है? – Gerard

+0

आपको 'एप्लिकेशन' करने की आवश्यकता नहीं है। RemoveMessageFilter (यह); '? यह अनिवार्य है। आप इसे 'UserControl' में कैसे रखेंगे? – Odys

0

नियंत्रण के "माउसइंटर" और "माउसलेव" घटनाओं में हैंडलर जोड़ने का प्रयास करें जो नियंत्रण के सीमावर्ती प्रकार को बदल देगा (यदि यह एक है)। जब माउस नियंत्रण की सीमा के अंदर चलता है तो माउसइंटर निकाल दिया जाता है, और जब माउस उस सीमा से बाहर निकलता है तो माउसलेव निकाल दिया जाता है। माउसहोवर में कुछ अतिरिक्त नियम हो सकते हैं, जैसे कि माउस को निश्चित समय के लिए स्थिर होना चाहिए।