2012-03-27 9 views
5

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

  1. एप्लिकेशन विंडो के बराबर आकार का बिटमैप बनाएं।
  2. सभी माउस और कीबोर्ड की घटनाओं के लिए कस्टम नियंत्रण राज्यों को अद्यतन (उदाहरण के लिए। यदि माउस वर्तमान में एक विशेष नियंत्रण आदि पर आयोजित किया जाता है)
  3. WM_PAINT घटना के लिए बिटमैप गुप्त के लिए पृष्ठभूमि रंग और उसके बाद के शीर्ष पर सभी अद्यतन नियंत्रण रंग यह अंततः ग्राफिक्स :: DrawImage (..) कॉल के माध्यम से सामने की बफर पर पूरी ऑफस्क्रीन छवि की प्रतिलिपि बनाएँ।
  4. WM_SIZE/WM_SIZING के लिए पिछले ऑफस्क्रीन बिटमैप को हटाएं और नए विंडो आकार के साथ एक और बनाएं।

इसके अलावा वहाँ कुछ चेकों नियंत्रण के बार-बार ड्राइंग को रोकने के लिए अर्थात नियंत्रण तैयार कर रहे हैं केवल जब यह दूसरे शब्दों में repainting की जरूरत है जब एक नियंत्रण की स्थिति बदल गया है उसके बाद ही यह e.t.c. चित्रित है कर रहे हैं

सिस्टम ठीक काम कर रहा है लेकिन केवल एक अपवाद के साथ ... जब खिड़की का आकार बदल रहा है तो कुछ प्रकार के फाड़ने का प्रभाव प्रकट होता है। अब मैं क्या प्रभाव फाड़ मतलब मैं आकार बढ़त/सीमा पर समझाने की कोशिश करेगा ...

एक अस्थिर खाई है के रूप में मैं खींचें मेरी DrawImage() फ़ंक्शन तुरंत और जबकि एक रिटर्न के रूप में अगर border.It है स्वैप ऑपरेशन आधे किया जाता है एक और छवि ड्राइंग शुरू होता है।

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

सबसे पहले मुझे लगता था कि निरंतर पूर्णस्क्रीन आकार ऑफस्क्रीन सतह का उपयोग करके आर्टिफैक्ट को कम किया जा सकता है, लेकिन जब मैंने कोशिश की तो परिणाम संतोषजनक नहीं हैं। मैंने आकार के दौरान स्लीप() को कॉल करने की भी कोशिश की ताकि फ़्लिपिंग एक और फ्लिप शुरू होने से पहले पूरी तरह से किया जा सके लेकिन अजीब तरह से यह मेरे लिए काम नहीं करेगा!

मैंने सुना है कि विस्टा पर जीडीआई हार्डवेयर तेज नहीं है, क्या यह समस्या हो सकती है?

मुझे आश्चर्य है कि क्यूटी जैसे फ्रेमवर्क इतनी आसानी से खिड़की रहित जीयूआई प्रस्तुत करता है, भले ही आप एक जटिल क्यूटी जीयूआई विंडो का आकार लें, बहुत तेज़ लापरवाही से थोड़ा आर्टिफैक्ट दिखाई देता है। जहां तक ​​मुझे पता है कि क्यूटी जीयूआई प्रतिपादन के लिए ओपनएलएल का उपयोग कर सकता है लेकिन यह दूसरा विकल्प है।

अगर मैं DirectX का उपयोग करें तो वास्तविक समय का आकार बदलने और भी कठिन, दूसरे हाथ पर ओपन बिना किसी समस्या के आकार बदलने के लिए अच्छा हो रहा है है, लेकिन मैं GDI + के सभी 2 डी ड्राइंग क्षमता खो देंगे।

यदि आप में से किसी ने मुझे ऐसा करने से पहले ऐसा कुछ किया है तो कृपया मुझे मार्गदर्शन करें। इसके अलावा यदि आपके पास कोई पॉइंटर है जो मुझे कस्टम यूजर इंटरफेस डिज़ाइन के लिए विचार करना चाहिए तो मुझे लिंक प्रदान करें।

धन्यवाद!

मैं हमेशा विंडोज मीडिया प्लेयर 11 जैसे इंटरफेस डिजाइन करना चाहता था लेकिन क्या कोई मुझे बता सकता है कि सी ++ प्रोग्रामर के लिए सीधा आगे समाधान है (मैं जानना चाहता हूं कि कुछ मौजूदा ढांचे का उपयोग करने के बजाय कैसे)? उपclassing, मालिक ड्राइंग, कस्टम ड्राइंग कुछ भी आपको नियंत्रण का स्तर देने के लिए प्रतीत होता है, मैं सामान्य नियंत्रण के साथ semitransparent नियंत्रण आकर्षित करने के लिए एक रास्ता नहीं जानता, तो मुझे लगता है कि यह सवाल कुछ विशेष ध्यान देने योग्य है। एक बार फिर धन्यवाद।

+0

यह एक परिचित समस्या है: http://stackoverflow.com/questions/9786218/drawing-in-window-while-resizing-leaves-unpainted-border –

+0

मैं इस दर्द से खुद हूं - मुझे एक फॉर्म चाहिए पूर्ण अल्फा समर्थन और परिवर्तनीय क्लिक-थ्रू। मैंने कभी भी चिकनी आकार बदलने में कामयाब नहीं रहा (और प्रॉक्सिंग घटनाओं जैसे अन्य सभी छोटे कंकों को काम करने में काफी समय लगा)। मुझे यह जानने में दिलचस्पी होगी कि आपको एक सभ्य समाधान मिल रहा है या नहीं। – Basic

+0

लेकिन क्यूटी जैसे चिकनी आकार बदलने वाले अन्य ढांचे के बारे में क्या? और अगर मुझे सही ढंग से याद है gtk भी खिड़की रहित गैर मूल कस्टम तैयार नियंत्रण का उपयोग करता है। मैं एक समाधान मौजूद हूं, लेकिन मुझे आश्चर्य है कि इस विषय के बारे में ऑनलाइन बहुत कम संसाधन हैं। कुछ लोग इस बात से असहमत होंगे कि एक सभ्य कस्टम जीयूआई होने के प्रयास के लायक नहीं है। – smit

उत्तर

5

क्या यह एक WM_ERASEBKGND संदेश हो सकता है जो इसका कारण बन रहा है? GDI+ double buffering in C++

इसके अलावा, अगर आप अपने GUI से तेजी से प्रतिक्रिया की जरूरत है मैं GDI + के खिलाफ सलाह देंगे:

इस सवाल को देखते हैं।

+0

हाँ मैंने इसका ख्याल रखा। – smit