2011-09-14 19 views
5

विंडोज़ में, प्रत्येक नियंत्रण के लिए (प्रत्येक संवाद, विंडो, टेक्स्टबॉक्स और चेकबॉक्स आदि के लिए) एक नियंत्रण आईडी दी जाएगी।विंडोज जीयूआई नियंत्रण आईडी कैसे बनाए जाते हैं?

यह नियंत्रण आईडी कैसे बनाई गई है? क्या विंडोज़ में दो अनुप्रयोगों में एक ही नियंत्रण आईडी हो सकती है? विंडोज नियंत्रण आईडी को मैन्युअल रूप से सेट करने का कोई तरीका है?

+0

क्या यह भी सच है? मुझे लगता है कि नियंत्रण आईडी का उपयोग करना चुन सकते हैं या नहीं। एक खिड़की हैंडल नियंत्रण की पहचान करने के लिए पर्याप्त है। –

+1

यह नहीं है। यह आमतौर पर केवल एक संवाद टेम्पलेट से बनाए गए संवादों के लिए सेट होता है। इसे बाद में SetWindowLongPtr, GWLP_ID के साथ बदला जा सकता है। –

+0

कई प्रकार के नियंत्रण आईडी हैं। स्वचालन आईडी वह है जिसे आप सेट करना चाहते हैं। क्या आप अपने ऐप के लिए WinForms, WPF, या Win32 का उपयोग कर रहे हैं? "फ्रेम नियंत्रण मैन्युअल रूप से सेट करने का कोई तरीका है" का उत्तर प्रत्येक ढांचे के लिए अलग होगा।और स्वचालन आईडी को विश्व स्तर पर अद्वितीय नहीं होना चाहिए - उन्हें केवल एक उपयोगी क्षेत्र में अद्वितीय होना चाहिए, क्योंकि आपको किसी विशेष नियंत्रण की पहचान करने के लिए पेड़ के नीचे एक अद्वितीय पथ की आवश्यकता है। इसे .NET GUI ऐप्स के लिए देखें: http://msdn.microsoft.com/en-us/library/aa349646.aspx –

उत्तर

5

नियंत्रण आईडी CreateWindow फ़ंक्शन पर पारित पैरामीटर में से एक है। यदि नियंत्रण एक संवाद टेम्पलेट से बनाया गया था, तो संवाद प्रबंधक संवाद टेम्पलेट से नियंत्रण आईडी प्राप्त करता है। दो नियंत्रणों के लिए एक ही आईडी होना आम बात है। उदाहरण के लिए, अधिकांश Cancel बटनों में नियंत्रण आईडी IDCANCEL होगी।

+0

मुझे नहीं पता कि कौन सा पैरामीटर CreateWindow नियंत्रण आईडी है। http://msdn.microsoft.com/en-us/library/windows/desktop/ms632679(v=vs.85).aspx – Erik

+0

आह, इसे मिला। आप HMenu का उपयोग करें। इसे इस पृष्ठ पर मिला: टिप्पणी अनुभाग में http://msdn.microsoft.com/en-us/library/windows/desktop/ms645478(v=vs.85).aspx। – Erik

+0

एक ही विंडो में एक ही आईडी के लिए दो नियंत्रणों के लिए यह ** असामान्य ** है। उदाहरण के लिए [GetDlgItem फ़ंक्शन] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645481 (v = vs.85) .aspx) उस पर निर्भर करता है। – user34660

4

रेमंड क्या लिखा है के अलावा:

यह एक खिड़की (नियंत्रण उर्फ) बच्चे खिड़कियों के बनाने के लिए और उन्हें एक ही ControlId देना पूरी तरह से कानूनी है। एकमात्र समस्या यह है कि आप अपनी आईडी (GetDlgItem() का उपयोग करके) द्वारा नियंत्रण को विशिष्ट रूप से पुनर्प्राप्त करने में सक्षम नहीं होंगे। यदि आप रनटाइम (जैसे स्थिर लेबल) पर नियंत्रण में हेरफेर करने में रुचि नहीं रखते हैं, तो आपको इसे एक अद्वितीय नियंत्रण आईडी देने की परवाह नहीं है। बस इसे 0xFFFF दें)।

यह निश्चित रूप से कानूनी (और सामान्य) अलग-अलग अनुप्रयोगों/अभिभावक विंडो (जैसे बटन के लिए आईडीकैनेल या आईडीओके) में विभिन्न नियंत्रण/बाल खिड़कियों के लिए एक ही नियंत्रण आईडी है। GetDlgItem() एक दिए गए पैरेंट विंडो के नियंत्रण को पुनर्प्राप्त करता है।

3

अन्य उत्तर में जानकारी के अलावा:

प्रत्येक के लिए खिड़कियों में और की तरह हर नियंत्रण एक नियंत्रण आईडी दी जाएगी (हर संवाद, खिड़की, पाठ बॉक्स और चेकबॉक्स आदि के लिए)

यह वास्तव में बिल्कुल सही नहीं है: शीर्ष-स्तरीय विंडो - जैसे ऐप विंडो और संवाद, वास्तव में नियंत्रण आईडी नहीं है। केवल बाल खिड़कियों में नियंत्रण आईडी हो सकती है।

(उच्च-स्तरीय विंडो का उपयोग कि CreateWindow के पैरामीटर खिड़की के लिए HMENU इंगित करने के लिए बजाय - तो केवल शीर्ष-स्तरीय खिड़कियों मेन्यूपट्टी हो सकता है।)

यह वास्तव में एप्लिकेशन डेवलपर के लिए ऊपर कैसे आवंटित करने के लिए तय करने के लिए है और आईडी का उपयोग करें। आमतौर पर वे GetDlgItem() के साथ उपयोग किए जाते हैं, जो एक एचडब्ल्यूएनडी को एक एचडीडब्ल्यू के साथ एक दिए गए आईडी के साथ देखता है, इसलिए उस स्थिति में, आईडी को केवल उस अभिभावक के भीतर अद्वितीय होना चाहिए। यदि किसी डेवलपर को रनटाइम पर नियंत्रण देखने की आवश्यकता नहीं है, तो यह इसे किसी भी आईडी दे सकता है, पारंपरिक रूप से -1 का उपयोग किया जाता है।

कुछ ढांचे नियंत्रण आईडी का उपयोग नहीं करते हैं और केवल बनाए गए एचडब्ल्यूएनडी का ट्रैक रखते हैं।

+0

WinSpy ++ का उपयोग करके मैंने calc.exe के लिए शीर्ष-स्तरीय विंडो को देखा और इसमें एक नियंत्रण आईडी है। मुझे पता है कि यह शीर्ष स्तर की खिड़की है क्योंकि इसकी मूल विंडो आईडी "00000000" है। – Sabuncu

+0

वह मान वास्तव में विंडो के मेनू हैंडल की संभावना है; विंडोज़ या तो मेनू हैंडलर या एक नियंत्रण आईडी है कि वे शीर्ष-स्तर या बाल खिड़कियां हैं या नहीं। माइक्रोसॉफ्ट से जासूस ++ उपकरण विंडो वैल्यू डायलॉग के अपने संस्करण में उसी मान का उपयोग करता है, इस मान को प्रदर्शित करने के लिए, "कंट्रोल आईडी" लेबल का उपयोग करके डिफ़ॉल्ट रूप से "मेनू हैंडल" में बदलकर, विंडो शीर्ष-स्तर पर है और मान है गैर-शून्य। शायद WinSpy ++ लेबल के उपयोग में मेहनती नहीं है। – BrendanMcK

+0

प्रतिक्रिया के लिए धन्यवाद। हालांकि, मैं 'GetDlgItem()' में कहा गया नियंत्रण आईडी पास करने में सक्षम हूं और बदले में एक सार्थक hwnd प्राप्त कर सकता हूं। मैं सोच रहा हूं कि अगर GetDlgItem() 'डेटा आइटम को वैध नियंत्रण आईडी के रूप में सम्मानित करता है, तो यह एक होना चाहिए। – Sabuncu

0

अन्य उत्तर के अलावा:

हालांकि नियंत्रण की आईडी एक ही हो सकता है, तो आप बेहतर उसे अद्वितीय बनाएं चाहते हैं। अपने आईडी और एचडब्ल्यूएन के साथ अपनी मूल विंडो में ईवेंट रिपोर्ट को नियंत्रित करें। अभिभावक के संदेश लूप में हम आमतौर पर नियंत्रण की पहचान करने के लिए आईडी का उपयोग करते हैं, इस मामले में, यदि आप अलग-अलग ईवेंट हैंडलिंग चाहते हैं, तो प्रत्येक नियंत्रण के लिए अलग-अलग आईडी का उपयोग करें।

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