यह उस तरह की झिलमिलाहट नहीं है जिसे डबल-बफरिंग हल कर सकती है। और न ही शुरुआत या निलंबित करें। आपके पास बहुत अधिक नियंत्रण हैं, BackgroundImage इसे बहुत खराब कर सकता है।
यह तब शुरू होता है जब UserControl स्वयं पेंट करता है। यह बैकग्राउंडइमेज को ड्रॉ करता है, जिसमें बाल नियंत्रण खिड़कियां जाती हैं, जहां छेद होते हैं। प्रत्येक बच्चे का नियंत्रण तब खुद को पेंट करने का संदेश देता है, वे अपनी खिड़की की सामग्री के साथ छेद में भर देंगे। जब आपके पास बहुत सारे नियंत्रण होते हैं, तो वे छेद कुछ समय के लिए उपयोगकर्ता को दिखाई देते हैं। वे आम तौर पर सफेद होते हैं, जब यह अंधेरा होता है तो BackgroundImage के साथ बुरी तरह विपरीत होता है। या वे काले हो सकते हैं यदि फॉर्म में अपनी Opacity या TransparencyKey प्रॉपर्टी सेट है, तो किसी भी चीज़ के साथ बुरी तरह से विपरीत।
यह विंडोज फॉर्म्स की एक बहुत ही मौलिक सीमा है, यह विंडोज विंडोज को रेंडर करने के तरीके से अटका हुआ है। WPF btw द्वारा निर्धारित, यह बच्चे के नियंत्रण के लिए खिड़कियों का उपयोग नहीं करता है। आप जो चाहते हैं, वह पूरे फॉर्म को डबल-बफ़र कर रहा है, जिसमें चाइल्ड कंट्रोल भी शामिल है। यह संभव है, समाधान के लिए इस धागे में मेरा कोड जांचें । हालांकि इसके साइड-इफेक्ट्स हैं, और यह वास्तव में पेंटिंग की गति को नहीं बढ़ाता है। कोड सरल है, इसे अपने रूप में पेस्ट करें (उपयोगकर्ता नियंत्रण नहीं):
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
कई चीजें हैं जो आप पेंटिंग की गति को बेहतर बनाने के लिए कर सकते हैं, इस बिंदु पर कि फ़्लिकर अब ध्यान देने योग्य नहीं है। BackgroundImage से निपटने के द्वारा शुरू करें। स्रोत की छवि बड़ी होने और नियंत्रण में फिट होने के लिए सिकुड़ने की आवश्यकता होने पर वे वास्तव में महंगे हो सकते हैं । BackgroundImageLayout प्रॉपर्टी को "टाइल" में बदलें। यदि वह ध्यान देने योग्य गति देता है, तो अपने पेंटिंग प्रोग्राम पर वापस जाएं और छवि को आकार दें ताकि विशिष्ट नियंत्रण आकार के साथ बेहतर मिलान हो सके। या UC के OnResize () विधि में छवि की एक उचित आकार की प्रतिलिपि बनाने के लिए कोड लिखें, ताकि इसे नियंत्रण repaints को हर बार रीसाइज़ न करना पड़े। उस प्रति के लिए Format32bppPArgb पिक्सेल प्रारूप का उपयोग करें, यह किसी भी अन्य पिक्सेल प्रारूप की तुलना में लगभग 10 गुना तेजी से प्रस्तुत करता है।
अगली चीज जो आप कर सकते हैं, वह छेद को ध्यान देने योग्य होने और छवि के साथ बुरी तरह से विपरीत होने से रोक सकता है। आप UC के लिए WS_CLIPCHILDREN स्टाइल फ्लैग को बंद कर सकते हैं , वह फ़्लैग जो उस UC को उस क्षेत्र में पेंटिंग करने से रोकता है जहाँ बच्चा नियंत्रण करता है। इस कोड को UserControl के कोड में पेस्ट करें:
protected override CreateParams CreateParams {
get {
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return parms;
}
}
बाल नियंत्रण अब पृष्ठभूमि की छवि के शीर्ष पर खुद को चित्रित करेगा। आप अभी भी उन्हें एक-एक करके खुद को रंगते हुए देख सकते हैं, लेकिन बदसूरत मध्यवर्ती सफेद या काला छेद दिखाई नहीं देगा।
अंतिम लेकिन कम से कम, बाल नियंत्रण की संख्या को कम करना हमेशा धीमी पेंटिंग की समस्याओं को हल करने का एक अच्छा तरीका है। UC के ऑनपेंट () इवेंट को ओवरराइड करें और ड्रा करें जो अब एक बच्चे में दिखाया गया है। विशेष लेबल और PictureBox बहुत बेकार हैं। बिंदु और क्लिक के लिए सुविधाजनक है, लेकिन उनका लाइट-वेट विकल्प (एक स्ट्रिंग या एक छवि खींचना) आपके ऑनपेंट () विधि में कोड की केवल एक पंक्ति लेता है।
UpdateStyles
इन्हें सेट करने के बाद कॉल किया था ? यह बुरी तरह से प्रलेखित है, लेकिन कभी-कभी आवश्यक हो सकता है।