2008-10-10 14 views
6

मैं एक RichTextBox जहां मैं अक्सर पाठ संपत्ति अद्यतन करने की आवश्यकता है, लेकिन जब मैं ऐसा RichTextBox "ब्लिंक" annoyingly के रूप में यह सब एक विधि कॉल भर ताज़ा करता है।आप रिचटेक्स्टबॉक्स को अपने प्रदर्शन को रीफ्रेश करने से कैसे रोकते हैं?

मैं अपनी विधि पूरी होने तक अस्थायी रूप से स्क्रीन रीफ्रेश को दबाने का एक आसान तरीका ढूंढने की उम्मीद कर रहा था, लेकिन वेब पर मिली एकमात्र चीज WndProc विधि को ओवरराइड करना है। मैंने इस दृष्टिकोण को नियोजित किया है, लेकिन कुछ कठिनाई और साइड इफेक्ट्स के साथ, और यह डिबगिंग को भी कठिन बना देता है। ऐसा लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए। क्या कोई मुझे बेहतर समाधान के लिए इंगित कर सकता है?

उत्तर

-3

इस आजमाएं:

myRichTextBox.SuspendLayout(); 
DoStuff(); 
myRichTextBox.ResumeLayout(); 
+0

आप भी myRichTextBox.Enabled जोड़ना पड़े = झूठी; और बाद में सक्षम = सत्य; – Geoff

+4

SuspendLayout() वास्तव में यहां मदद नहीं करता है। –

0

तुम सिर्फ एक स्ट्रिंग में पाठ की दुकान कर सकते हैं, स्ट्रिंग पर अपनी जोड़तोड़ करते हैं, और विधि के अंत में, इसे वापस स्टोर पाठ संपत्ति में?

3

यहाँ मिला: http://bytes.com/forum/thread276845.html

मैं के बाद मैं के अपडेट हो तो निष्क्रिय करने के लिए फिर से सक्षम एक अमान्य() द्वारा पीछा किया SendMessage के माध्यम से एक WM_SETREDRAW भेज दिया। यह काम करने लग रहा था।

मैं इस विधि की कोशिश की कभी नहीं किया है।

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == paint) 
    { 
     if (!highlighting) 
     { 
      base.WndProc(ref m); // if we decided to paint this control, just call the RichTextBox WndProc 
     } 
     else 
     { 
      m.Result = IntPtr.Zero; // not painting, must set this to IntPtr.Zero if not painting otherwise serious problems. 
     } 
    } 
    else 
    { 
     base.WndProc(ref m); // message other than paint, just do what you normally do. 
    } 
} 

आशा इस मदद करता है: मैं वाक्य रचना हाइलाइटिंग है और RTB कक्षा में निम्नलिखित का इस्तेमाल किया है कि एक RTB के साथ एक आवेदन पत्र लिखा है।

+0

WM_SETREDRAW मेरे लिए काम किया। LockWindowUpdate के समान होना चाहिए। –

-1

मैं LockWindowUpdate

 

[DllImport("user32.dll", EntryPoint="LockWindowUpdate", SetLastError=true, 
ExactSpelling=true, CharSet=CharSet.Auto, 
CallingConvention=CallingConvention.StdCall)] 
+3

-1। यह इसका उचित उपयोग नहीं है। Http://blogs.msdn.com/b/oldnewthing/archive/2007/02/19/1716211.aspx देखें। –

9

पर रखने का सुझाव देते हैं मैं मूल प्रश्न, और जवाब यह है कि सबसे अच्छा मेरे लिए था WM_SETREDRAW साथ() SendMessage की BoltBait के उपयोग काम पूछा। ऐसा लगता है कि WNDProc विधि के उपयोग से कम दुष्प्रभाव होते हैं, और मेरे एप्लिकेशन में LockWindowUpdate के रूप में तेज़ी से दो बार प्रदर्शन करता है।

मेरी विस्तारित RichTextBox वर्ग के भीतर, मैं तो बस इन दोनों तरीकों जोड़ा, और मैं उन्हें जब भी मैं जब तक मैं कुछ प्रसंस्करण कर रहा हूँ repainting पुनः आरंभ को रोकने के लिए की जरूरत है। अगर मैं RichTextBox वर्ग के बाहर से ऐसा करने के लिए इच्छुक थे, मुझे लगता है कि यह सिर्फ अपने RichTextBox उदाहरण के संदर्भ में "इस" से बदल कर काम करेगा।

private void StopRepaint() 
    { 
     // Stop redrawing: 
     SendMessage(this.Handle, WM_SETREDRAW, 0, IntPtr.Zero); 
     // Stop sending of events: 
     eventMask = SendMessage(this.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero); 
    } 

    private void StartRepaint() 
    { 
     // turn on events 
     SendMessage(this.Handle, EM_SETEVENTMASK, 0, eventMask); 
     // turn on redrawing 
     SendMessage(this.Handle, WM_SETREDRAW, 1, IntPtr.Zero); 
     // this forces a repaint, which for some reason is necessary in some cases. 
     this.Invalidate(); 
    } 
+0

कोड को पूरा करने का कोई मौका? वर्तमान में लिखे गए यह लगभग संकलित नहीं है। –

10

यहाँ है पूर्ण और काम कर रहे उदाहरण:

private const int WM_USER = 0x0400; 
    private const int EM_SETEVENTMASK = (WM_USER + 69); 
    private const int WM_SETREDRAW = 0x0b; 
    private IntPtr OldEventMask;  

    [DllImport("user32.dll", CharSet=CharSet.Auto)] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 

    public void BeginUpdate() 
    { 
     SendMessage(this.Handle, WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero); 
     OldEventMask = (IntPtr)SendMessage(this.Handle, EM_SETEVENTMASK, IntPtr.Zero, IntPtr.Zero); 
    }  

    public void EndUpdate() 
    { 
     SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
     SendMessage(this.Handle, EM_SETEVENTMASK, IntPtr.Zero, OldEventMask); 
    } 
संबंधित मुद्दे