2012-02-14 10 views
6

मैं कॉम्बोबॉक्स ड्रॉपडाउन (या संदर्भ मेनू सहित उस मामले के लिए अन्य ड्रॉप डाउन) के व्यवहार को मॉडल करने की कोशिश कर रहा हूं, जहां आप कहीं भी क्लिक करते समय ड्रॉप डाउन बंद हो जाते हैं, यहां तक ​​कि किसी भी चीज़ पर ध्यान केंद्रित नहीं किया जा सकता है।कॉम्बोबॉक्स कैसे गिराए जाने पर माउस को कैप्चर करता है?

मैंने MouseCaptureChanged, LostFocus, और Leave जैसे ईवेंट के लिए सदस्यता लेने का प्रयास किया है। मेरे पास एक कस्टम UserControl है जो एक ड्रॉपडाउन के रूप में कार्य कर रहा है और जब उपयोगकर्ता कहीं और क्लिक करता है तो मैं इसे बंद करना चाहता हूं।

ऐसा लगता है कि कई नियंत्रणों में ऐसा कुछ किया गया है, इसलिए मुझे आश्चर्य होगा कि ऐसा करने का कोई आसान तरीका नहीं था।

अब तक किए गए अत्यधिक तरीकों से मैं पिनवोक और सेटकैप्चर() फ़ंक्शन का उपयोग कर रहा हूं, या एक संदेशफिल्टर बनाने के लिए उपयोग कर सकता हूं। यदि ये एकमात्र विकल्प हैं तो मुझे यकीन नहीं है कि कौन सा बेहतर है।

+2

नियंत्रण की तरह एक ड्रॉपडाउन लागू करने के लिए एक आसान तरीका है एक ToolStripControlHost और एक ToolStripDropDown उपयोग करने के लिए है। कॉम्बोबॉक्स की तरह काम करता है। देखें [सूची आइटम को प्रदर्शित करते समय कॉम्बो बॉक्स कैसे करते हैं, सूची को छिपाने के लिए फॉर्म पर कहीं भी माउस ईवेंट को अवरुद्ध करते हैं?] (Http://stackoverflow.com/a/8611382/719186) – LarsTech

+0

मैं ToolStripControlHost को आजमा रहा हूं। पॉपअप के शीर्ष पर एक बदसूरत सीमा से छुटकारा नहीं मिल सकता है, या जब भी आप ड्रॉपडाउन खोलते हैं तो कॉम्बोबॉक्स की झटके से छुटकारा नहीं मिल सकता है। –

+2

ToolStripContorlHost के मार्जिन और टूलस्ट्रिपड्रॉपडाउन के पैडिंग को 0 पर सेट करना सुनिश्चित करें। अपने नियंत्रण पर फ़्लिकरिंग एक अलग समस्या है - क्या आप कस्टम ड्रॉप डाउन के साथ कॉम्बोबॉक्स का उपयोग करने का प्रयास कर रहे हैं? – LarsTech

उत्तर

1

कॉम्बोबॉक्स 2 नियंत्रणों से बनाया गया है।

  • आधार - दिखाई जब सक्रिय (नियंत्रण)
  • DropDownList नहीं - संपादन मोड या सूची चयन मोड (विंडो या फॉर्म)

आम तौर पर बेस दिख रहा है के दौरान दिखाई। जब उपयोगकर्ता कॉम्बोबॉक्स पर क्लिक करता है, तो बेस नियंत्रण छुपाता है और ड्रॉपडाउनलिस्ट नियंत्रण दिखाता है। यह स्विच पृष्ठभूमि पर किया जाता है, इसलिए उपयोगकर्ता के लिए ऐसा लगता है कि नियंत्रण अभी विस्तारित है।

जो ईवेंट आप पकड़ना चाहते हैं वह ड्रॉपडाउनलिस्ट विंडो के माध्यम से किया जाता है। यदि आप अपने क्लाइंट एरिया पर कहीं भी क्लिक करते हैं, तो ड्रॉपडाउनलिस्ट विंडो WM_KILLFOCUS ईवेंट WndProc (संदेश% m) विधि के माध्यम से प्राप्त करता है। तब माता-पिता खिड़की (आधार नियंत्रण) wParam के साथ एक WM_COMMAND ( OCM_COMMAND) संदेश के लिए भेजता = 526,318 ( HIWORD (wParam) = 8) और बेस नियंत्रण जानते हैं कि वह DropDownList विंडो को छिपाने चाहिए।

तो, आपको अतिरिक्त ड्रॉपडाउन विंडो को लागू करने और WM_KILLFOCUS ईवेंट को पकड़ने के लिए क्या करना है।

0

आपके द्वारा वर्णित नियंत्रणों के टेम्पलेट्स ड्रॉपडाउन सूचियों के लिए एक कंटेनर के रूप में एक पॉपअप सूचियों के साथ एक कंटेनर के रूप में उपयोग कर रहे हैं जो गलत पर सेट है (जो डिफ़ॉल्ट मुझे लगता है)।

ComboBox template example

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

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