2014-04-03 10 views
5

मैं अपने gamedev परियोजनाओं के लिए बहुत कम इन-गेम जीयूआई लाइब्रेरी बना रहा हूं, लेकिन मुझे फोकस को संभालने का एक साफ तरीका खोजने में परेशानी हो रही है।जीयूआई लाइब्रेरी: फोकस को सही तरीके से कैसे संभालें?

मेरी लाइब्रेरी नेस्टेड लिस्टबॉक्स और विजेट पदानुक्रमों का समर्थन करती है, लेकिन मुझे विजेट फोकस से निपटने के दौरान अजीब व्यवहार को रोकने का कोई तरीका नहीं दिख रहा है। उदाहरण प्रपत्र:

|------------| 
| Form [X] | 
|------------| 
|   | 
| [Button01] | 
|   | 
| [List1][v] | 
|   | 
| [Button02] | 
|   | 
|------------| 

मेरे डिजाइन एक Context उद्देश्य यह है कि Widget वस्तुओं की एक सूची संग्रहीत करता है सुविधाएँ। Widget में कई बच्चे हो सकते हैं। मेरे पास Widget के सभी बच्चों/माता-पिता को दोबारा शुरू करने की सुविधा है।

मेरा ध्यान तर्क वर्तमान में है: संदर्भ व्यस्त है

  1. हैं (खींच, आकार बदलने, संपादन ...), फोकस

  2. में परिवर्तन नहीं करते माउस संदर्भ के बाहर दबाया जाता है तो या संदर्भ विकेन्द्रित, सब कुछ

  3. सर्वोच्च दबाया बच्चे का पता लगाएं, है unfocus यदि कोई

  4. का पता लगाएं "गहरे" पदानुक्रम में बच्चे को दबाया

  5. Unfocus सब कुछ लेकिन विजेट के रूप में गहरी गहरी बच्चे के रूप में, और ध्यान केंद्रित संदर्भ

लेकिन यह कई अवसरों में विफल रहता है, विशेष रूप से नेस्टेड सूची के साथ और बक्सें। मैंने ऑनलाइन एक अच्छा समाधान खोजने की कोशिश की लेकिन कोई आलेख/ट्यूटोरियल नहीं मिला। मुझे यकीन नहीं है कि मुझे विशेष विजेट्स पर विशेष ध्यान देना चाहिए, या यदि कोई "अच्छा" एल्गोरिदम है जो किसी भी स्थिति में ठीक से काम करता है।


जीयूआई पुस्तकालय आमतौर पर विजेट फोकस कैसे संभालते हैं?

क्या ListBoxes या ComboBoxes जैसे विजेट्स पर विशेष ध्यान देने के लिए विशेष निर्देश हैं?

यहां मेरी जीयूआई लाइब्रेरी के source code और video here है।

+0

उम्म .. यह आपके प्रश्न का उत्तर देने से संबंधित नहीं है। यह आपके कोड/भंडारों पर सिर्फ एक टिप्पणी है। सुनिश्चित नहीं है कि उचित सी ++ .. कार्यान्वयन सहित कोड की प्रत्येक पंक्ति आपके शीर्षकों में या कक्षा घोषणा के भीतर है .. सबकुछ इनलाइन घोषित किया गया है। संकलन करने के लिए आप कितने घंटे इंतजार करते हैं? अगला यह है कि मुश्किल से किसी भी पंक्ति में कोई टिप्पणी या कोई दस्तावेज़ीकरण/रीडेम नहीं है .. सबकुछ एसएसवी/एसएसयू/एसएसवीयू नाम दिया गया है .. कुछ भी नहीं के लिए टेम्पलेट्स के टन .. सही फ़ाइल को इंगित करने के लिए स्रोत-कोड लिंक बदलें चेक करना चाहते हैं। वह लिंक एक फ़ोल्डर को इंगित करता है जिसमें कई फाइलें शामिल हैं .. – Brandon

+0

* जीयूआई पुस्तकालय आमतौर पर विजेट फोकस कैसे संभालते हैं? * आप हमेशा [MyGUI] जैसे खुले स्रोत जीयूआई पुस्तकालयों पर एक नज़र डाल सकते हैं (http://mygui.info /)। –

+0

"हालांकि, यह कई अवसरों में विफल रहता है" - यह क्या करता है? आप यह क्या करने की उम्मीद करते हैं? जबकि हम इसमें हैं, "फोकस" से आपका क्या मतलब है? इस नाम से अलग विचार हैं। –

उत्तर

2

मैं डेटा संरचना जैसे पेड़ को परिभाषित करने का सुझाव देता हूं जिसमें नोड को डेटा (विंडो हैंडल, बूल आइसफोकस और कुछ अतिरिक्त डेटा की आवश्यकता होती है) के रूप में परिभाषित किया गया है, साथ ही कुछ पॉइंटर्स नोड्स - पैरेंट, पहले बच्चे, बाएं भाई, दाएं भाई। साथ ही, विंडो डेटा क्षेत्र के भीतर नोड पॉइंटर को स्टोर करें ताकि दिए गए विंडो हैंडल से आप नोड पॉइंटर पुनर्प्राप्त कर सकें। नोड पॉइंटर से, डेटा आपको वैसे भी विंडो हैंडल देगा। अब, जब भी रूट विंडो फोकस खो देती है, क्योंकि आपने अन्य एप्लिकेशन पर माउस क्लिक किया है या alt + टैब या कुछ हिट किया है, तो मुख्य विंडो फोकस खो देती है और आपको फोकस फोकस का उचित संदेश मिलता है। इसे संभालें, खिड़की हैंडल से सभी को रीसेट करें नोड पेड़ के लिए फोकस। जब भी आप कुछ खिड़की पर क्लिक करते हैं, तो आपको लाभप्रद संदेश मिलता है, विंडो हैंडल से नोड को ढूंढने के लिए, सेट सही है। और जब तक आप शीर्ष नोड (रूट) तक नहीं पहुंच जाते, तब तक अपने सभी माता-पिता की नाइड की फ़ोकस को सत्य के रूप में सेट करें। क्या इसने सहायता की?

1

मुझे कोई यूआई एल्गोरिदम नहीं पता है या यूआई के साथ उचित तरीका क्या है, हालांकि मैंने बहुत समय पहले एक सामान्य यूआई लाइब्रेरी लागू की थी (सर्वश्रेष्ठ नहीं बल्कि यह उस समय के लिए इसका उद्देश्य प्रदान करता था), और शायद उपयोग की जाने वाली दृष्टिकोण आपकी आवश्यकताओं के अनुरूप हो सकती है।

क्रम बच्चों को माता-पिता से घटनाओं को संभाल करने के लिए, दो कार्य निम्नलिखित प्रोटोटाइप के साथ इस्तेमाल किया गया,:

int handleEventReceived(int eventType, void* data); 
int getEventConsumers(int eventType, vector<IConsumers*>& consumers); 

ऑप्टिकल फाइबर केबल eventTypes एक enum में पाए गए।

सभी बच्चों में लागू किए गए पहले कार्य के साथ, प्रत्येक बच्चों और बच्चों के बच्चों (इसलिए प्रसारण) को ईवेंट भेजने के लिए एक पुनरावर्ती कार्य का उपयोग किया जा सकता है। जब कोई बच्चा ईवेंट का जवाब देता है, तो यह 0 देता है, अन्यथा यह कुछ त्रुटि कोड देता है (उदाहरण के लिए ERRROR_EVENT_NOT_TREATED)।

हालांकि, यदि आप अपने यूआई के केवल विशिष्ट हिस्सों को किसी निश्चित घटना का जवाब देने के लिए चाहते हैं तो आप दूसरे फ़ंक्शन का उपयोग करते हैं।

दूसरा फ़ंक्शन "अधिकतम प्रतिक्रिया प्राथमिकता" और इस प्राथमिकता से जुड़े उपभोक्ताओं को लौटाता है। उदाहरण के लिए यदि आपके contaiers प्राथमिकता 5 के साथ प्राथमिकता 5 और 2 बटन के साथ 3 बटन हैं, तो यह 6 लौटाएगा और एक सरणी जिसमें दो बटन होंगे, जिससे आप ईवेंट भेज सकते हैं।

आपके मामले में, आप कहते हैं कि आपको उप-घटकों के लिए फ़ोकस को संभालने की आवश्यकता है। ऊपर वर्णित दृष्टिकोण का उपयोग करके, मैं एक ईवेंट ET_FOCUS_RECEIVED बनाउंगा, और आवश्यकता के अनुसार प्रत्येक UI तत्व पर इस ईवेंट के लिए अलग-अलग प्राथमिकताओं को रखूंगा।

आपकी स्थिति में, यदि आप पदानुक्रम में तत्व गहरा हो जाते हैं, तो ईवेंट की प्राथमिकता को बढ़ाने के लिए, उसी गहराई के तत्वों की समान प्राथमिकता होगी (इसलिए गहरे बच्चे के रूप में गहरे विजेट्स सभी घटनाओं का इलाज करेंगे)।

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