चूंकि 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;
}
}
}
स्रोत
2013-01-14 15:35:17
वहाँ एक TextArea की तरह कुछ नहीं है? –
@ यूक्लिड्स म्यूलेम्बे - उन्हें बोल्ड, इटालिक्स जैसी सभी फीचर की आवश्यकता हो सकती है लेकिन छवियों को –
@DJKRAZE नहीं, अगर वह केवल पढ़ने के लिए उपयोग करता है तो वह कीबोर्ड के माध्यम से टेक्स्ट जोड़ने में भी सक्षम नहीं होगा। –