2010-07-19 9 views
12

अक्षम करना मैं एक समारोह है कि एक RichTextBox लेता है और कीवर्ड की & 'BADWORDS' सूची पर पहुंच गया है बना रहा हूं। मैं कोई भी कीवर्ड & BADWORDS मैं RichTextBox में मिल जबकि उपयोगकर्ता, जो समारोह हर बार एक संपादन कुंजी जारी की है कहा जाता है का मतलब है लिख रहा है उजागर करने के लिए की जरूरत है।RichTextBox वाक्य रचना वास्तविक समय में प्रकाश डाला - रीपेंट

मैं इस समारोह में लिखा है, लेकिन शब्द और बॉक्स झिलमिलाहट में कर्सर भी आराम के लिए ज्यादा।

मैं एक समाधान की खोज की है - RichTextBox के जब मैं संपादन कर रहा हूँ और अपने पाठ को स्वरूपित करने में ही फिर से रंगना करने की क्षमता को निष्क्रिय करने के। हालांकि, एक ही रास्ता मैं जानता हूँ कि यह करने के लिए इस प्रकार रीपेंट संदेश ओवरराइड करने के लिए "WndProc" समारोह और अंत: खंड (मैं क्या इकट्ठा करने के लिए किया गया है है):

protected override void WndProc(ref System.Windows.Forms.Message m) 
{ 
    if (m.Msg == 0x00f) { 
     if (paint) 
      base.WndProc(ref m); 
     else 
      m.Result = IntPtr.Zero; 
    } 
    else 
     base.WndProc(ref m); 
} 

कहाँ बूलियन 'रंग' जब मैं समाप्त करता हूं तो मैं हाइलाइट करना शुरू करता हूं और सत्य होने से ठीक पहले झूठ पर सेट होता हूं। लेकिन जैसा कि मैंने कहा, मैं जो फ़ंक्शन करता हूं उसे RichTextBox में लेना चाहिए; मैं उप-वर्ग का उपयोग नहीं कर सकता।

तो, वहाँ एक RichTextBox का स्वत: repainting के निष्क्रिय करने के लिए एक तरीका है 'बाहर से?'

उत्तर

21

यह RichTextBox कक्षा में एक निरीक्षण है। ListBox जैसे अन्य नियंत्रण, पेंटिंग को दबाने के लिए BeginUpdate और EndUpdate विधियों का समर्थन करते हैं। वे विधियां WM_SETREDRAW संदेश उत्पन्न करती हैं। वास्तव में आरटीबी इस संदेश का समर्थन करता है, लेकिन वे विधियों को जोड़ना भूल गए।

बस उन्हें स्वयं जोड़ें। परियोजना + कक्षा जोड़ें, नीचे दिखाए गए कोड पेस्ट करें। टूलबॉक्स के शीर्ष से नियंत्रण को अपने फॉर्म पर संकलित करें और छोड़ दें।

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

class MyRichTextBox : RichTextBox { 
    public void BeginUpdate() { 
     SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero); 
    } 
    public void EndUpdate() { 
     SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
     this.Invalidate(); 
    } 
    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 
    private const int WM_SETREDRAW = 0x0b; 
} 

या पी/पाठ को अपडेट करने से पहले सीधे/भेजें SendMessage को आमंत्रित करें।

+1

कक्षा के लिए यह अतिरिक्त मेरे लिए काम नहीं करता है। यह कुछ ग्राफिक्स समस्याओं का कारण बनता है और अंत में नियंत्रण पूरी तरह से काम करना बंद कर देता है, ताकि आप कर्सर को भी स्क्रॉल न कर सकें। FYI करें। – MoonKnight

+4

एक कार्यकर्ता धागे से नियंत्रण अद्यतन करते समय सुंदर मानक विफलता मोड। –

+0

हंस, मैं इस सामान के लिए नए रूप से नया हूं। क्या कह रहे हो/ऊपर के साथ, जिसका तात्पर्य है? यही कारण है कि इसके बाद के संस्करण वर्ग विस्तार के बाद, पाठ बॉक्स के लिए अद्यतन एक अलग धागा पर किया जाना चाहिए कि? आपके समय के लिए धन्यवाद। पुन: सक्षम ड्राइंग यह तय करने के बाद एक अमान्य (जोड़ने) - – MoonKnight

0

आपका सबसे अच्छा शर्त को पूरा करने के तुम क्या करने की कोशिश कर रहे हैं जो एक बहु आवेदन तैयार करना है। आप एक थ्रेड बनाना चाहते हैं जो आपकी सूची के विरुद्ध टेक्स्ट की जांच करे। यह धागा किसी भी उदाहरण को कतार में पायेगा। आप एक और धागा भी बनाना चाहते हैं जो शब्दों की वास्तविक हाइलाइटिंग करता है। क्योंकि आपको UI को अपडेट करने के लिए BeginInvoke() और Invoke() का उपयोग करने की आवश्यकता होगी, आप यह सुनिश्चित करना चाहते हैं कि आप उस दर को थ्रॉटल करें जिस पर इसे कॉल किया जाता है। मैं प्रति सेकंड 20 बार इतना नहीं चाहता था। ऐसा करने के लिए, तो आप इस तरह कोड का उपयोग करेंगे:

DateTime lastInvoke=DateTime.Now; 

if ((DateTime.Now - lastInvoke).TotalMilliseconds >=42) 
{ 
    lastInvoke=DateTime.Now; 
    ...Do your highlighting here... 
} 

यह धागा शब्द और प्रकाश डाला जाना करने के लिए या फिर से प्रकाश डाला जरूरत है कि लगातार किसी भी नए अद्यतन के लिए कतार की जाँच करेगा के लिए अपने कतार जाँच करेगा। उम्मीद है कि यह समझ में आता है!

+0

धन्यवाद, मैं अगर मैं अपने प्रश्न का उत्तर नहीं मिल रहा है कि कोशिश कर सकते हैं देखें। मैं अभी जो कर रहा हूं वह सही काम करता है अगर मैं हाइलाइट कर रहा हूं तो मैं पेंट को अक्षम कर सकता हूं। – Robz

+0

हाँ मैं आपके सवाल का अपनी नहीं एक सीधा जवाब पता है, लेकिन सोचा था कि आप इनपुट की सराहना करेंगे :) इस विधि जैसे Microsoft Word कार्य के रूप में कैसे कार्यक्रम, है। – Icemanind

5

मैंने हंस की सिफारिश में संशोधन करने के लिए पर्याप्त अंक जमा नहीं किए हैं। इसलिए मैं यह InvalidateRect को फोन करके एक रीपेंट अनुरोध करने के लिए आवश्यक हो सकता है कि उल्लेख करने के लिए इस उत्तर गयी। कुछ प्रारंभ/समाप्ति अद्यतन कार्यान्वयन अद्यतन लॉक की अंतिम रिलीज पर स्वचालित रूप से ऐसा करते हैं। इसी प्रकार .NET, नियंत्रण पर नियंत्रण। अमान्य() जो देशी InvalidateRect समारोह का आह्वान कहा जा सकता है।

MSDN: अंत में, आवेदन InvalidateRect समारोह कॉल कर सकते हैं सूची बॉक्स रंगा जा करने के लिए होता है।

WM_SETREDRAW

+0

मैं एक ही समस्या है जो Killercam का वर्णन किया गया था हो रही थी। – Oli

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