2009-04-13 9 views
9

हम अपनी अधिकांश खिड़कियों पर विभिन्न गोलाकार किनारों के साथ एक चमकीले ऐप का विकास कर रहे हैं। मैं गैर-आयताकार आकार को परिभाषित करने के लिए विंडो क्षेत्रों का उपयोग कर रहा हूं, लेकिन लगभग हर कोई इस कारणों को छेड़छाड़ करने के लिए ऑब्जेक्ट करता है, क्योंकि पिक्सेल केवल पूरी तरह से अपारदर्शी या पूरी तरह से पारदर्शी हो सकता है।चिकनी विंडो सीमाओं को बनाने के लिए स्तरित विंडो का उपयोग

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

यहां मैं क्या करता हूं: मेरे पास एक खिड़की है, इसे ए कॉल करें, नियंत्रण और टेक्स्ट के साथ और जो भी खिड़की शामिल है। मेरे पास विंडो ए के बच्चे के रूप में विंडो बी है, सिवाय इसके कि WS_CHILD की बजाय WS_POPUP शैली है, इसलिए यह स्वयं को ए के क्षेत्र के बाहर स्थित कर सकता है और ए के नियंत्रण के शीर्ष पर खींचा जा सकता है। विंडो बी में WS_EX_LAYERED शैली भी है, और प्रारंभिकरण पर, मैं UpdateLayeredWindow को ULW_ALPHA ध्वज के साथ कॉल करता हूं और एक अल्फा चैनल के साथ 32 बिट बिटमैप वाला एक स्रोत डीसी, प्रति-पिक्सेल अल्फा के साथ आकर्षित करने के लिए।

विंडो बी के लिए स्रोत डीसी में उपयोग किया जाने वाला बिटमैप खिड़की की सीमा के चारों ओर बस पिक्सल है जो मैं खिड़की की पृष्ठभूमि से पूरी पारदर्शिता में आसानी से मिश्रण करना चाहता हूं। मैं पूरे दो विंडो दृष्टिकोण को छोड़ दूंगा और केवल एक स्तरित विंडो का उपयोग करूँगा, सिवाय इसके कि जब आप UpdateLayeredWindow का उपयोग कर रहे हों, तो यह सामान्य WM_PAINT संदेशों के बदले मेमोरी में रखे बफर से खींचा जाता है और यह सब कुछ, और प्राप्त करने का प्रयास कर रहा है इंटरैक्टिव बाल नियंत्रण (और बाल खिड़कियां) अच्छी तरह से काम करने के लिए एक असाधारण परेशानी की तरह लगता है (और शायद सब कुछ के लिए भी काम नहीं करेगा)।

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

किक्स के लिए, यह दिखाता है कि टुकड़े किस तरह दिखते हैं, यह दिखाने के लिए कि मेरा क्या मतलब थोड़ा बेहतर है।

  • Window A's background, साइयन पूरी तरह से पारदर्शी पिक्सेल मास्क करने के लिए उपयोग किया जाता है।
  • Window B's bitmap, अल्फा चैनल के साथ (निश्चित रूप से चित्रित नहीं है, यह एक jpg है) जो गैर-काले पिक्सल को पारदर्शिता में मिश्रित करेगा।
  • Combined result

तो, यह काम करता है, लेकिन मैं यह वास्तव में यह करने के लिए सबसे अच्छा तरीका है कुछ नहीं हो सकता। मेरे पास दो प्रश्न हैं:

  • क्या यह ध्वनि स्वीकार्य है, या क्या इसके बारे में कुछ भी भयानक रूप से भयानक है?
  • जैसा कि यह वर्तमान में काम करता है, ऐसा लगता है कि यह ऑफ-स्क्रीन बफर का उपयोग विंडो के आकार (जो 1024x768 तक हो सकता है) का उपयोग कर रहा है, भले ही इसमें बहुत कम पिक्सेल के पास कोई गैर-शून्य अस्पष्टता डेटा हो - क्या यह होगा ओवरहेड के लायक और इसे अलग-अलग सीमा के टुकड़ों में काटने और उन्हें एक साथ कंपोजिट करने की अतिरिक्त जटिलता?
+0

डौग, यदि आप इसके लिए कोड साझा कर सकते हैं तो यह बहुत अच्छा होगा। अग्रिम में धन्यवाद। –

उत्तर

2

मेरा उत्पाद प्रत्येक विंडो में संलग्न छोटे टैब को आकर्षित करने के लिए स्तरित विंडो का उपयोग करता है। मैंने अलियासिंग के बिना चिकनी गोल करने के लिए स्तरित खिड़कियों का उपयोग किया। अब तक की एकमात्र ग़लत समस्या यह है कि कुछ ओपनजीएल विंडोज़ विंडोज एक्सपी और विस्टा पर डीडब्लूएम के बिना स्तरित विंडोज़ के शीर्ष पर लिखी गई हैं। इसकी निम्न स्तर की समस्या है और माइक्रोसॉफ्ट बहुत मददगार नहीं रहा है। आप इसे Google धरती खोलकर और अपने एप्लिकेशन को मुख्य प्रतिपादन विंडो पर खींचकर पुन: उत्पन्न कर सकते हैं, आपकी स्तरित विंडो गायब हो जाएगी।

+0

यह ठीक होना चाहिए; यह ऐप मूल रूप से एक बड़े, पूर्ण-स्क्रीन डायरेक्टएक्स ऐप के लिए लॉन्चर के रूप में कार्य करता है, इसलिए यह संभावना नहीं है कि एक और 3 डी/ग्राफिक्स-गहन प्रोग्राम एक साथ चल रहा है (जो कि वैसे भी खराब मुद्दों का कारण बनता है, क्योंकि हम निम्न-अंत हार्डवेयर का समर्थन करते हैं)। हालांकि चेतावनी के लिए धन्यवाद! –

3

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

1
  1. आरडीपी और वी एम (हाइपर-वी & VMWare) के तहत परीक्षण करने के लिए भूल जाते हैं
  2. कई gfx कार्ड की कोशिश करो और नेटबुक और लैपटॉप (यदि लागू हो) पर है।
संबंधित मुद्दे