2008-10-02 21 views
9

मेरे पास एक संवाद है जो आकार बदलता है। इसमें एक कस्टम पृष्ठभूमि भी है जिसे मैं WM_ERASEBKGND कॉल (वर्तमान में FillSolidRect के लिए एक साधारण कॉल) के जवाब में पेंट करता हूं।विंडोज संवाद में WM_ERASEBKGND को संभालने के दौरान झिलमिलाहट से कैसे बचें

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

आकार बदलने के दौरान मैं संवाद झिलमिलाहट मुक्त कैसे कर सकता हूं? मुझे संदेह है कि डबल-बफरिंग को एक भाग खेलना चाहिए, लेकिन मुझे यकीन नहीं है कि बाल नियंत्रण के साथ एक संवाद के साथ ऐसा कैसे करें (सभी बच्चे को मालिक-ड्रा या उसके जैसा कुछ नियंत्रित किए बिना)।

मैं, नोट करना चाहिए कि मैं सी का उपयोग कर रहा ++ (नहीं नेट), और MFC हालांकि शुद्ध Win32 आधारित समाधान स्वागत कर रहे हैं :)

नोट: एक बात मैं कोशिश की, लेकिन जो नहीं काम नहीं किया (निश्चित क्यों) था:

CDC memDC; 
memDC.CreateCompatibleDC(pDC); 
memDC.FillSolidRect(rect, backgroundColor); 

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); 

उत्तर

8

यह मानते हुए कि "FillSolidRect" अपनी पृष्ठभूमि के मिटा है तो WM_ERASEBKGND से सही वापस जाएँ।

डबल कोडिंग करने के लिए जो आप लगभग अपने कोड खंड में कर रहे हैं, आपको CreateCompatibleBitmap का उपयोग करना होगा और इसे अपने एमएमडीसी में चुनना होगा।

3

डबल बफरिंग वास्तव में यह काम करने का एकमात्र तरीका है।

बाल नियंत्रण स्वयं को तब तक ख्याल रखेंगे जब तक आप सुनिश्चित करें कि CLIPCHILDREN

5

WM_ERASEBKGND हैंडलिंग में कुछ भी नहीं करें और अपने मुख्य WM_PAINT के हिस्से के रूप में मिटाएं। आप या तो स्मार्ट पेंट कर सकते हैं ताकि आप केवल अमान्य क्षेत्रों को फिर से चला सकें, या अधिक आसानी से, ड्राइंग को डबल-बफर करें।

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

6

अपने OnInitDialog समारोह में निम्न पंक्ति जोड़कर प्रयास करें:

ModifyStyle(0, WS_CLIPCHILDREN, 0); 
5

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

4

आप अपने कॉल का पैरामीटर अमान्येट्रैक विधि को गलत के रूप में सेट कर सकते हैं। विंडो आपको फिर से चलाए जाने पर आपको WM_ERASEBKGND भेजने से रोक देगा। Here खिड़की में झिलमिलाहट रोकने के लिए एक अच्छा लिंक है।