2010-08-02 10 views
5

पर चलते समय माउसलेव घटना आग लगती है मैं समस्या को हल करने में असमर्थता के कारण इस प्रश्न को दोबारा पोस्ट कर रहा हूं (मूल here)।नियंत्रण के स्क्रॉलबार

ट्री व्यू, लिस्टबॉक्स में, या ऐसा लगता है कि मेरी Google खोज स्क्रॉलबार के साथ कुछ भी है, स्क्रॉलबार को नियंत्रण का हिस्सा नहीं माना जाता है।

मेरे पास एक वृक्ष दृश्य है कि मैं एक कस्टम नियंत्रण में डाल रहा हूं, और यह डॉक फिल है। तो वहां यह कस्टम ट्री व्यू के रूप में कार्य करता है जिसमें एक ही स्थान पर इसे प्रबंधित करने के लिए हमारे सभी तर्क हैं।

हमारे कार्यक्रम के कुछ हिस्सों में हम इसे माउसइंटर घटना के आधार पर स्लाइड करते हैं, और इसे माउसलेव ईवेंट पर वापस स्लाइड करते हैं, हालांकि हम वर्तमान में इसके लिए एक तृतीय पक्ष लाइब्रेरी के ट्री व्यू का उपयोग कर रहे हैं, जिसे मुझे प्रतिस्थापित करने के लिए कार्य किया गया है।

तो मैंने सबकुछ विंडोज ट्री व्यू में ले जाया है, लेकिन माउसलेव को विश्वसनीय रूप से कैप्चर करने का कोई तरीका नहीं मिल सकता है- अगर यह पूरे TreeView को छोड़ देता है, तो स्क्रॉलबार शामिल है।

मैंने कई पिक्सल वाले पैनल में इसे लपेटने और पैनल के माउसलेव को कैप्चर करने का एक हैकिश समाधान देखा है, लेकिन मुझे शायद ही विश्वास है कि माइक्रोसॉफ्ट ने हमें इस स्थिति में ऐसा करने का इरादा किया था।

कम में:

स्क्रॉलपट्टी नियंत्रण के लिए mouseenter या mouseleave आग नहीं है, और है कि नियंत्रण उपयोगकर्ता स्क्रॉलपट्टी उपयोग नहीं कर सकते, क्योंकि व्यर्थ बाहर फिसलने के लिए mouseenter/mouseleave का उपयोग कर बनाता है।

इस स्थिति को संभालने का पसंदीदा तरीका क्या है?

पिछले प्रश्न में मुझे Spy ++ का उपयोग करने और स्क्रॉलबार के लिए MouseEnter/MouseLeave को संभालने के लिए WndProc() से अटैच करने का प्रयास दिया गया था।

हालांकि यह काम नहीं करता था क्योंकि स्पाइ ++ दिखाया गया था कि WndProc() में फॉर्म स्तर या नियंत्रण स्तर पर फायरिंग नहीं किया गया था। ऐसा लगता है जैसे .NET बस स्क्रॉलबार नहीं देख सकता है।

WndProc() का उपयोग करना इस तरह के एक सरल अनुरोध के लिए अवास्तविक लगता है, क्या ऐसा करने का कोई और तरीका है, या यदि WndProc() एकमात्र तरीका है, तो क्या कोई वास्तव में इसे प्राप्त करने में सक्षम है और मुझे दिखाता है कि कैसे?

उत्तर

4

इसके लिए कोई साफ समाधान नहीं है। आपका पैनल चाल या तो काम नहीं करता है, जब उपयोगकर्ता माउस को तेज़ी से ले जाता है तो इसे पूरी तरह याद किया जाएगा।

पंट। एक बार जब आप MouseEnter प्राप्त करते हैं, तो 200 एमसीसी टाइमर शुरू करें। टिक घटना में, जांचें कि माउस अभी भी पेड़ दृश्य को घुमा रहा है या नहीं। उदाहरण के लिए:

private void treeView1_MouseEnter(object sender, EventArgs e) { 
     timer1.Enabled = true; 
     treeView1.Width = 220; 
    } 

    private void timer1_Tick(object sender, EventArgs e) { 
     Point pos = treeView1.PointToClient(Cursor.Position); 
     if (!treeView1.DisplayRectangle.Contains(pos)) { 
      timer1.Enabled = false; 
      treeView1.Width = 50; 
     } 
    } 

एप्लिकेशन.इडल इवेंट बहुत बीटीडब्ल्यू काम करता है, बस थोड़ा और अजीब।

+0

यह पूरी तरह से काम करता है, धन्यवाद! –

2

टिप के लिए धन्यवाद एक ही समस्या थी, मैंने टाइमर_Tick ईवेंट को चौड़ाई में 20 जोड़कर स्क्रॉलबार को संशोधित करने के लिए संशोधित किया।

private void tmrListPos_Tick(object sender, EventArgs e) 
    { 
     Point posLB = clbPlants.PointToClient(Cursor.Position); 
     Rectangle rectPlants = clbPlants.DisplayRectangle; 
     rectPlants.Width = rectPlants.Size.Width + 20; 
     if (!rectPlants.Contains(posLB)) 
     { 
      tmrListPos.Enabled = false; 
      clbPlants.Size = clbPlants.MinimumSize; 
     } 
    } 
संबंधित मुद्दे