2009-08-26 12 views
18

विंडोज फॉर्म में फ्लिकर को संबोधित करने वाले बहुत से लेख हैं। बहुमत DoubleBuffered = true सेटिंग सेट करने या ControlStyle झंडे का एक समूह सेट करने की अनुशंसा करते हैं। हालांकि, इनमें से कोई भी मदद टेक्स्टबॉक्स फ्लिकरिंग को कम नहीं करती है।विंडोज फॉर्म टेक्स्टबॉक्स को आकार बदलने पर झटके से कैसे रोकें?

यहाँ संबंधित प्रश्नों की एक जोड़ी हैं:

समस्या को पुनः करने के लिए, एक नया WinForms परियोजना बनाने, एक TextBox जोड़ने, बहु लाइन सक्षम, अक्षम शब्द-लपेटें, पाठ का एक गुच्छा जोड़ें, Anchor को बाएं + दाएं + शीर्ष + नीचे सेट करें। अब चलाएं और आकार बदलें। पाठ झिलमिलाहट। कुछ घोंसले TableLayoutPanel के अंदर टेक्स्ट बॉक्स के लिए आकार बदलने पर झिलमिलाहट भी बदतर है।

उपरोक्त प्रश्नों में प्रस्तावित समाधानों को सर्वोत्तम रूप से लागू करना झिलमिलाहट को ठीक न करें; अगर मुझे प्रयोगात्मक हो और पर TextBox पर संरक्षित ControlStyle सेट करें, तो मैं इसे पूरी तरह से तोड़ सकता हूं (UserPaint सक्षम करके) लेकिन झिलमिलाहट को खत्म नहीं कर सकता।

तो, क्या टेक्स्टबॉक्स में टेक्स्ट की झटके को ठीक करने के लिए कोई तरीका है?

+1

दिलचस्प पोस्ट, मेरे पास लेबल नियंत्रण के साथ समान समस्याएं हैं, लेकिन आधार पर मैंने डबलबफर को केवल AllPaintInWmPaint के साथ सेट किया जाना चाहिए जिसे केवल उपयोगकर्ता पेंट के साथ सेट किया जाना चाहिए, मैंने इसे दोहराया नहीं है ... – Ian

+0

@romkyns, मैंने अपना उत्तर अपडेट किया है एक समाधान के साथ मैं अतीत में इस्तेमाल किया है। – Ash

उत्तर

15

मैं आमतौर पर एक RichTextBox बजाय एक बहु पाठ बॉक्स का उपयोग करें। DetectUrls- और ShortcutsEnabled-Properties को सेट करके आरटीबी को टेक्स्टबॉक्स के समान व्यवहार करता है और ... फ़्लिकर-मुक्त है।

+0

यह निश्चित रूप से सबसे तेज़ और आसान समाधान है। मैंने टेक्स्टबॉक्स पर आधारित कस्टम नियंत्रण लिया और बस माता-पिता को RichTextBox में बदल दिया और समस्या हल हो गई। – Andy

+0

यह स्वीकार्य उत्तर कैसे नहीं था? यह पूरी तरह से सटीक है, धन्यवाद! (माना जाता है, यह बाल नियंत्रण के लिए झिलमिलाहट के मुद्दों में मदद नहीं करेगा जो टेक्स्टबॉक्स नहीं थे, लेकिन यह सवाल नहीं था।) – neminem

0

हमें अतीत में एक ही तरह की समस्या का सामना करना पड़ा है और यह अत्यधिक डॉकिंग और टेबल लेआउट पैनलों का उपयोग करने के लिए आता है। यदि संभव हो तो मैं सुझाव दूंगा, यूआई को फिर से बनाने के लिए न्यूनतम उपयोग करने की कोशिश करें (तालिका लेआउट पैनल आंतरिक रूप से डॉकिंग का भी उपयोग करता है)।

+0

मैंने यह भी देखा है कि झिलमिलाहट खराब हो जाती है क्योंकि लेआउट से संबंधित नियंत्रणों की संख्या बढ़ जाती है। दुर्भाग्य से बुनियादी आकार प्राप्त करने के लिए आवश्यक न्यूनतम न्यूनतम लेआउट के साथ भी अभी भी झिलमिलाहट है - जैसे कि मेरे उदाहरण में। –

4

विंडोज़ फॉर्म में डबलबफर्ड संपत्ति टेक्स्ट बॉक्स जैसे बाल नियंत्रण को प्रभावित नहीं करती है। इसके बजाए यह केवल उस फॉर्म या पैनल को प्रभावित करता है जो इसके लिए सेट है।

यदि आप किसी फॉर्म पर बाल तत्वों के लिए डबल बफरिंग चाहते हैं, तो आपको मैन्युअल डबल बफरिंग को लागू करने की आवश्यकता होगी।

बॉब पॉवेल ने यह करने के तरीके पर good article (और अन्य) लिखा है।

इसके अलावा, forum answer एक से बॉब भी कहते हैं:

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

इस सही ढंग से करने के लिए एक ही रास्ता है कि सभी ड्राइंग बनाए रखा मोड ग्राफिक्स प्रणाली के एक फार्म का उपयोग करके करता है एक भी नियंत्रण बनाने के लिए है।

इसलिए, झिलमिलाहट मुक्त पाठ बॉक्स मैनुअल डबल बफरिंग का उपयोग कर आप किसी भी तरह अपनी पीठ बफर करने के लिए पाठ बॉक्स प्रस्तुत करना और फिर बफ़र अपडेट के भाग के रूप में प्रदर्शित करने की आवश्यकता होगी का आकार बदलने के लिए। यदि संभव हो, तो मुझे उम्मीद नहीं है कि यह आसान होगा।

[अपडेट]

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

यहां एक बुनियादी समाधान है जिसे मैंने कुछ साल पहले ऐसा करने के लिए उपयोग किया था। यह एक साधारण रूप है जिसमें एक मल्टीलाइन टेक्स्टबॉक्स और पैनल से विरासत में एक कस्टम क्लास है। दोनों नियंत्रणों में एक ही स्थान और आकार होता है। आकार बदलने पर पैनल को दिखाने के लिए यह फॉर्म ResizeBegin और ResizeEnd का उपयोग करता है, और अन्यथा टेक्स्टबॉक्स। यह सही नहीं है लेकिन यह झटके को खत्म कर देता है।

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     Bitmap bm = null; 

     private void textBox1_Resize(object sender, EventArgs e) 
     { 

      Graphics g = textBox1.CreateGraphics(); 

      if (g.VisibleClipBounds.IsEmpty == false) 
      { 
       bm = new Bitmap((int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height); 

       textBox1.DrawToBitmap(bm, new Rectangle(0, 0, (int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height)); 

      } 

      g.Dispose(); 


     } 

     private void panelDB1_Paint(object sender, PaintEventArgs e) 
     { 
      if (bm != null) 
      { 
       e.Graphics.DrawImageUnscaled(bm, 0, 0,bm.Width,bm.Height); 
      } 
     } 

     private void Form1_ResizeBegin(object sender, EventArgs e) 
     { 
      panelDB1.BringToFront(); 
     } 

     private void Form1_ResizeEnd(object sender, EventArgs e) 
     { 
      panelDB1.SendToBack(); 
     } 
} 

class PanelDB : Panel 
{ 
    public PanelDB() 
    { 
     this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer,true);  
     //this.DoubleBuffered = true; 

    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
    } 
} 
+0

धन्यवाद। लेख डबल बफरिंग तकनीकों से अपरिचित लोगों के लिए उपयोगी हो सकता है, लेकिन वास्तव में प्रश्न को हल करने में मदद नहीं करता है। खिड़की के स्वामित्व के बारे में - मुझे यह महसूस हो रहा है कि विंडोज़ पर देशी टेक्स्टबॉक्स मूल रूप से झटकेदार है और यह अत्यधिक हैक्स के बिना अपरिहार्य है ... –

+0

मैंने अपने प्रश्न में एक अपडेट जोड़ा है। दुर्भाग्य से आपके प्रश्न का उत्तर बस "आप नहीं कर सकते", मैंने सोचा कि कुछ पृष्ठभूमि जानकारी उपयोगी होगी। – Ash

+0

मेरे पुराने कोड को जांचने पर मुझे लगता है कि DrawToBitmap() विधि का उपयोग इन-मेमोरी बिटमैप पर फ़्लिकर के बिना टेक्स्टबॉक्स को प्रस्तुत करना आसान है। लेकिन यह केवल आपके टेक्स्ट बॉक्स की एक ऑन-स्क्रीन छवि तैयार करेगा जो कभी भी आकार बदलने पर झिलमिलाहट नहीं करता है लेकिन पूरी तरह से बेकार है क्योंकि यह आपको टेक्स्ट दर्ज करने की अनुमति नहीं देता है। – Ash

-2

फंक्शन LockWindow के रूप में लंबे नियंत्रण भेजें ghDlg,% TEXT_UPPER,% WM_SETREDRAW, 0,0 CLEARBuffers अंत फंक्शन

फंक्शन UnlockWindow के रूप में लंबे ClearBuffers नियंत्रण ghDlg भेजें,% TEXT_UPPER,% WM_SETREDRAW, 1, 0 अंत समारोह

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