2013-01-14 9 views
5

संभव डुप्लिकेट:
How to prevent richTextBox to paste images within it?केवल RichTextBox पाठ कैसे बनाएं?

आप Richtextbox उपयोग कर रहे हैं, उदाहरण के लिए Richtextbox में कई लाभ हैं:

हम इसे

पर रंग फ़ॉन्ट का उपयोग कर सकते हैं

कस्टम फ़ॉन्ट सेट करना एक क्षेत्र

उस पर फ़ाइलें अटैच .. आदि में

चित्र पर एक नज़र डालें: enter image description here

यहाँ मेरी समस्या है:

मैं सिर्फ यह केवल पाठ कर सकते हैं ?

मेरी प्रोजेक्ट में, फ़ाइल संलग्न करें या जैसे ही अनावश्यक है। मैं भी उस पर एक छवि संलग्न या पेस्ट नहीं करना चाहता था, मुझे बस "केवल पाठ"Richtextbox

मैं यह कैसे कर सकता हूं?

+0

वहाँ एक TextArea की तरह कुछ नहीं है? –

+0

@ यूक्लिड्स म्यूलेम्बे - उन्हें बोल्ड, इटालिक्स जैसी सभी फीचर की आवश्यकता हो सकती है लेकिन छवियों को –

+0

@DJKRAZE नहीं, अगर वह केवल पढ़ने के लिए उपयोग करता है तो वह कीबोर्ड के माध्यम से टेक्स्ट जोड़ने में भी सक्षम नहीं होगा। –

उत्तर

6

चूंकि RichTextBox में कोई छवियां या ऑब्जेक्ट संग्रह नहीं है, तो आपको आरटीएफ स्वरूपण कोड के लिए जाना होगा। RichTextBox के सभी डेटा को विशेष स्वरूपण कोड के साथ सादा पाठ के रूप में संग्रहीत किया जाता है, यह इसकी आरटीएफ संपत्ति के माध्यम से नियंत्रण से उजागर होता है। यदि आप इसे पढ़ना या बदलना चाहते हैं, तो इस कोड भाषा को सीखना आवश्यक है, सीखने के संसाधन पूरे वेब पर आसानी से उपलब्ध हैं, उदाहरण के लिए इस सिंहावलोकन देखें। RichTextBox एमएस वर्ड इत्यादि जैसे कई पूर्ण-फीचर एडिटर्स की तुलना में अधिक सरलीकृत आरटीएफ कोड का उपयोग करता है, इसलिए आमतौर पर आरटीबी में डेटा को लोड करने से पहले लोड करना फायदेमंद होता है, इससे बहुत अनावश्यक डेटा हटा दिया जाएगा।

एक लंबी कहानी कम करना, मैंने पाया कि आरटीएफ समूहों की खोज करना जरूरी है जो "चित्र" या "ऑब्जेक्ट" कमांड से शुरू होते हैं। यह जानकर कि समूहों को घोंसला दिया जा सकता है, आप वहां से पहले एंड-ग्रुप चार को नहीं ढूंढ सकते हैं, आपको समूह के अंत को खोजने के लिए ग्रुपिंग की गिनती करते हुए स्ट्रिंग चार को चारों ओर पार्स करना होगा। अब स्ट्रिंग के उस हिस्से को हटाने के लिए आपके पास पर्याप्त जानकारी है। आरटीएफ में कई चित्र/ऑब्जेक्ट समूह हो सकते हैं, इसलिए आपको इसे तब तक करना होगा जब तक कि सभी हटा दिए जाते हैं। यहां एक नमूना फ़ंक्शन है जो उन समूहों को हटाने के बाद आरटीएफ स्ट्रिंग लौटाता है:

private string removeRtfObjects(string rtf) 
{ 
    //removing {\pict or {\object groups 
    string pattern = "\\{\\\\pict|\\{\\\\object"; 
    Match m = Regex.Match(rtf, pattern); 
    while (m.Success) { 
     int count = 1; 
     for (int i = m.Index + 2; i <= rtf.Length; i++) { 
      //start group 
      if (rtf(i) == '{') { 
       count += 1; 
      //end group 
      } else if (rtf(i) == '}') { 
       count -= 1; 
      } 
      //found end of pict/object group 
      if (count == 0) { 
       rtf = rtf.Remove(m.Index, i - m.Index + 1); 
       break; // TODO: might not be correct. Was : Exit For 
      } 
     } 
     m = Regex.Match(rtf, pattern); 
     //go again 
    } 
    return rtf; 
} 

यह कब किया जाना चाहिए? आप पहले ही पेस्ट का उल्लेख कर चुके हैं, वहां भी सम्मिलित है, इन्हें कीडाउन ईवेंट से फंस लिया जा सकता है जहां आपको क्लिपबोर्ड जानकारी मिलती है और तदनुसार इसे संभालती है। E.Handled = सही सेट करना जब आपने ऑपरेशन को संभाला है तो यह संकेत करता है कि नियंत्रण को इस कुंजी संयोजन के लिए कोई डिफ़ॉल्ट प्रसंस्करण नहीं करना चाहिए। यह भी है कि आप उपयोगकर्ताओं को क्लिपबोर्ड को नष्ट किए बिना चिपकाने वाली छवियों को कैसे अवरुद्ध करते हैं। उदाहरण:

private void RichTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    //aware of Paste or Insert 
    if (e.Control && e.KeyCode == Keys.V || e.Shift && e.KeyCode == Keys.I) { 
     if (Clipboard.ContainsImage || Clipboard.ContainsFileDropList) { 
      //some images are transferred as filedrops 
      e.Handled = true; 
      //stops here 
     } else if (Clipboard.ContainsData(DataFormats.Rtf)) { 
      RichTextBox rtbox = new RichTextBox(); 
      //use a temp box to validate/simplify 
      rtbox.Rtf = Clipboard.GetData(DataFormats.Rtf); 
      this.RichTextBox1.SelectedRtf = this.removeRtfObjects(rtbox.Rtf); 
      rtbox.Dispose(); 
      e.Handled = true; 
     } 
    } 
} 
+0

वाह अच्छा, यह एक बहुत सटीक जवाब है। आपके उत्तर के लिए धन्यवाद .. – Ricks

+0

आपने 'if (rtf (i) == '{') 'अगर यह नहीं होना चाहिए' (आरटीएफ [i] == '{')' – botenvouwer

+1

मैंने आपके उत्तर को थोड़ा सा संपादित किया है अपना कोड उदाहरण थोड़ा और कॉपी पेस्ट दोस्ताना बनाओ। – botenvouwer

2

हां, यह संभव है।

RichTextBox1_KeyDown में Ctrl + V को संभालें, फिर क्लिपबोर्ड में डेटा प्रारूप की जांच करें: यदि डेटा सादा पाठ है, तो इसे पेस्ट करें; यदि डेटा आरटीएफ है, तो इसे सादा पाठ में बदलें (क्लिपबोर्ड सामग्री को बदले बिना बफर में) और इसे पेस्ट करें; किसी अन्य प्रकार के डेटा पेस्ट न करें।

यह एक आंशिक उदाहरण केवल आपके दिखाने के लिए है आगे बढ़ने के लिए कैसे:

private void richTextBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.V) 
    { 
      // suspend layout to avoid blinking 
      richTextBox2.SuspendLayout(); 

      // get insertion point 
      int insPt = richTextBox2.SelectionStart; 

      // preserve text from after insertion pont to end of RTF content 
      string postRTFContent = richTextBox2.Text.Substring(insPt); 

      // remove the content after the insertion point 
      richTextBox2.Text = richTextBox2.Text.Substring(0, insPt); 

      // add the clipboard content and then the preserved postRTF content 
      richTextBox2.Text += (string)Clipboard.GetData("Text") + postRTFContent; 

      // adjust the insertion point to just after the inserted text 
      richTextBox2.SelectionStart = richTextBox2.TextLength - postRTFContent.Length; 

      // restore layout 
      richTextBox2.ResumeLayout(); 

      // cancel the paste 
      e.Handled = true; 
    } 
} 
संबंधित मुद्दे