2010-07-20 13 views
20

मेरे पास एक ऐप है जिस पर इसका नियंत्रण है। और इसमें बड़ी मात्रा में झिलमिलाहट है, खासकर स्टार्टअप पर।विंडोज़ फॉर्म ऐप में फ्लिकरिंग

मैंने इसे fix पर लागू किया।

protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x02000000; // WS_EX_COMPOSITED 
      return cp; 
     } 
    } 

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

मैक्सिमाइज़, न्यूनतम और बंद बटन की उपयोगिता को बनाए रखने के दौरान मैं WS_EX_COMPOSITED कैसे रखूं?

यह विंडोज एक्सपी पर होता है। जैसा कि @fallenidol ने इंगित किया है, यह विंडोज 7 पर कोई मुद्दा नहीं है।

+5

बिल्कुल सही सवाल (मुझे यह कार्यक्षमता चाहिए, मैंने इस संकल्प को आजमाया है, मैं इस नई बाधा के साथ इस कार्यक्षमता को कैसे प्राप्त करूं)। –

+0

बीटीडब्लू, मैंने विंडोज 7 पर चल रहे एक परीक्षण एप में इस फिक्स की कोशिश की और अधिकतम, न्यूनतम और बंद बटन अभी भी एनिमेट करने लगते हैं। – pmcilreavy

+0

@fallenidol। यह जानकर अच्छा लगा। मेरे सभी ग्राहक एक्सपी पर हैं। – AngryHacker

उत्तर

11

मैंने इसे समझ लिया। यह प्रपत्र दिखाए जाने के बाद WS_EX_COMPOSITED ध्वज को निकालना है। मेरे ब्लॉग पर पूर्ण विवरण और कोड:

How to get rid of flicker on Windows Forms applications

+0

शानदार .. मेरे लिए काम किया – Marshal

+0

अच्छा दस्तावेज। उसके लिए धन्यवाद। Upvoted। – C4u

+0

@ होसेनिन हाँ, ब्लॉग अब के लिए नीचे है ... उम्मीद है कि इस महीने किसी बिंदु पर बहाल हो जाएगा। – AngryHacker

0

आपको मानक विंडोज़ फॉर्म नियंत्रण संपत्ति को डबलबफर्ड कहा जाता है। http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered.aspx

+0

जो केवल प्रति-नियंत्रण आधार पर काम करता है। मैंने जो उदाहरण दिया है वह फॉर्म पर हर नियंत्रण पर डबल-बफरिंग को मजबूर करता है। – AngryHacker

+0

आप प्रत्येक नियंत्रण की इस संपत्ति को भरने के लिए ऐप की शुरुआत में प्रतिबिंब का उपयोग कर सकते हैं। – Kru

+0

मैं तीसरे पक्ष के नियंत्रण के लिए ऐसा नहीं कर सकता जो इस संपत्ति का पर्दाफाश नहीं करता है। – AngryHacker

4

निम्नलिखित कोड आज़माएं। यह मुख्य रूप और आपके पास मौजूद किसी अन्य कस्टम उपयोगकर्ता नियंत्रण में जाना चाहिए।

 // Enable double duffering to stop flickering. 
     this.SetStyle(ControlStyles.DoubleBuffer, true); 
     this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     this.SetStyle(ControlStyles.UserPaint, true); 
     this.SetStyle(ControlStyles.SupportsTransparentBackColor, false); 
     this.SetStyle(ControlStyles.Opaque, false); 
     this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
     this.SetStyle(ControlStyles.ResizeRedraw, true); 
+0

मैंने पोस्ट किए गए कोड का पूरा बिंदु यह है कि आप इसे एक बार करते हैं, न कि प्रत्येक उपयोगकर्ता नियंत्रण के लिए (जो सैकड़ों + तीसरे पक्ष के नियंत्रण के टन हैं)। – AngryHacker

+3

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

5

मैं जानता हूँ कि इस सवाल का एक छोटा सा पुराना है, लेकिन कभी नहीं से बेहतर है देर से। मैंने आपके मूल उदाहरण का उपयोग किया है जिसे आप आकार देने के दौरान इसे टॉगल करते हैं, फिर इसे पूरी तरह से खींचने के लिए इसे वापस टॉगल करते हैं। उम्मीद है कि यह दूसरों को इस समस्या का समाधान खोजने में मदद करता है। चूंकि ओपी जानता है, अकेले डबलबफरिंग फ्लिकरिंग मुद्दों को हल नहीं करते हैं।

यहाँ झिलमिलाते उपयोगकर्ता द्वारा फ़ॉर्म के आकार बदलता है जब रोकने के लिए एक काम के आसपास है, लेकिन इस तरह के DataGridView, NumericUpDown, आदि के रूप नियंत्रण के ड्राइंग अप खिलवाड़ के बिना प्रदान की आपके प्रपत्र नाम "Form1":

int intOriginalExStyle = -1; 
bool bEnableAntiFlicker = true; 

public Form1() 
{ 
    ToggleAntiFlicker(false); 
    InitializeComponent(); 
    this.ResizeBegin += new EventHandler(Form1_ResizeBegin); 
    this.ResizeEnd += new EventHandler(Form1_ResizeEnd); 
} 

protected override CreateParams CreateParams 
{ 
    get 
    { 
     if (intOriginalExStyle == -1) 
     { 
      intOriginalExStyle = base.CreateParams.ExStyle; 
     } 
     CreateParams cp = base.CreateParams; 

     if (bEnableAntiFlicker) 
     { 
      cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED 
     } 
     else 
     { 
      cp.ExStyle = intOriginalExStyle; 
     } 

     return cp; 
    } 
} 

private void Form1_ResizeBegin(object sender, EventArgs e) 
{ 
    ToggleAntiFlicker(true); 
} 

private void Form1_ResizeEnd(object sender, EventArgs e) 
{ 
    ToggleAntiFlicker(false); 
} 

private void ToggleAntiFlicker(bool Enable) 
{ 
    bEnableAntiFlicker = Enable; 
    //hacky, but works 
    this.MaximizeBox = true; 
} 
+0

अच्छा बिंदु। मेरे पास यह ऐप मेरे ऐप में है, लेकिन इसे मेरे ब्लॉग एंट्री में जोड़ने के लिए उपेक्षित है। इसे दो दिनों में अपडेट कर देगा। – AngryHacker

0

मैं अभी इस पोस्ट में आया हूं और महसूस करता हूं कि यह थोड़ा पुराना है। हालांकि, मुझे अपने फॉर्म के साथ एक ही समस्या है और पता चला है (XP के लिए, वैसे भी) एक सुरुचिपूर्ण समाधान दृश्य शैलियों को सक्षम नहीं कर रहा है।

+0

फॉलो अप के रूप में, मुझे ऑनपेंटबैकग्राउंड ओवरराइड करते समय झिलमिलाहट के साथ कोई समस्या नहीं है। अगर मैं पृष्ठभूमि को चित्रित नहीं करना चाहता, तो मैं ई। ग्राफिक्स। क्लीयर ([उचित रंग]) को कॉल करता हूं और लौटाता हूं, अन्यथा बेस इवेंट विधि कहा जाता है। जैसा कि मैंने कहा, यह इस मुद्दे को कम करने के लिए "लगता है"। हालांकि, मैं सोच रहा हूं कि अप्रत्याशित प्रतिक्रियाएं क्या हो सकती हैं। – Tebc

+0

सुधार। उपर्युक्त ओवरराइड तब तक काम करता है जब तक कि फॉर्म की न्यूनतम आकार की संपत्ति वर्तमान आकार पर सेट हो। – Tebc

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