2011-06-28 11 views
6

मैंने कई अनुप्रयोगों को देखा है जो आपको बहुत से टेक्स्ट संपादन करने की उम्मीद करते हैं, डबल क्लिक टेक्स्ट के लिए गैर-डिफ़ॉल्ट व्यवहार प्रदान करेंगे, जिसमें एप्लिकेशन टेक्स्ट को हाइलाइट करता है, जिसका मानना ​​है कि आप सबसे अधिक संभावना से बातचीत करने की कोशिश कर रहे हैं।टेक्स्ट क्षेत्र या टेक्स्ट बॉक्स पर डबल क्लिक करते समय हाइलाइट व्यवहार निर्दिष्ट करें?

एक त्वरित उदाहरण के रूप में, इस वाक्य विभिन्न अनुप्रयोगों में अलग तरह से व्यवहार करती है:

यह एक "नमूना" वाक्य

अगर मैं टाइप नोटपैड में और डबल शब्द 'नमूना' पर क्लिक करें कि है (आदर्श रूप से शब्द का मध्य, कहते हैं, नमूना के 'एम' और 'पी' के बीच) फिर दूसरे उद्धरण के बाद अंतरिक्ष में पहले उद्धरण से नोटपैड हाइलाइट करता है। यदि वह वाक्य विजुअल स्टूडियो में एक टिप्पणी में है और मैं उसी स्थान पर डबल क्लिक करता हूं, तो यह कोट्स को हाइलाइट किए बिना नमूने के 'ई' से 'एस' पर हाइलाइट करता है।

मैं अपने स्वयं के एप्लिकेशन में इन हाइलाइटिंग व्यवहार को कैसे अनुकूलित कर सकता हूं? क्या यह Winforms से WPF से अलग है? मुझे लगता है कि मैं इसे डबल क्लिक इवेंट पर काम करने के लिए अपना रास्ता हैक कर सकता हूं, लेकिन क्या इसके लिए विशेष रूप से एक और अधिक सुरुचिपूर्ण/जानबूझकर समाधान है?

+0

क्या किसी भी इस्तेमाल का मेरा जवाब था या क्या यह प्रश्न एक मृत प्रश्न है? – Skintkingle

+0

आपका उत्तर वह है जो मैं करता हूं अगर मैं अपनी तरह की चीज रोल करना चाहता हूं। मैं एक घटना संचालित, संदर्भ संवेदनशील तरीके के लिए तैयार किए गए दृष्टिकोण की तलाश कर रहा था ताकि डबल क्लिक पर टेक्स्ट को हाइलाइट करने के लिए कस्टम स्थितियां हों। जाहिर है ऐसा करने का कोई तरीका नहीं है। –

उत्तर

2

हां, जैसा कि आप चाहते हैं, डबलक्लिक घटना का उपयोग करना चाहते हैं, क्योंकि ऐसा लगता है कि यह दो बार चयन कर रहा है जो धीमा है, खराब दिखता है, और अवांछित घटनाओं/कोड को ट्रिगर कर सकता है।

तो नीचे दिए गए कोड को कम से कम Winforms के लिए चाल करना चाहिए। एक नई कक्षा बनाएं, और सामान्य रूप से टेक्स्टबॉक्स (या RichTextBox) का विस्तार करें (नए बनाए गए नियंत्रण का उपयोग करके जो कि डिजाइनर में जादुई रूप से दिखाई दे)। मैंने एक साधारण दिनचर्या बनाई है जहां आप उपयोग करने के लिए डिलीमीटर निर्दिष्ट कर सकते हैं। थोड़ा और काम के साथ, इसे केवल एक ही के बजाय वर्णों की एक श्रृंखला के लिए खाते में आसान होना चाहिए, या यहां तक ​​कि चयन के अन्य उन्नत तरीकों को भी बनाना आसान होना चाहिए।

यदि आप RichTextBox के बजाय टेक्स्टबॉक्स का उपयोग कर रहे हैं, तो बस "रिच" बिट को हटाएं जो क्लास परिभाषा में दो बार दिखाई देता है।

class RichTextBoxX : RichTextBox 
{ 
    char delimiter = ','; // Specify what character to use for start and end of selection 

    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     if (m.Msg==0x0203) // WM_LBUTTONDBLCLK 
     { 
      // Perfect situation for off-by-one bugs! Checked thoroughly for at least 10 mins, so should be okay now: 
      int start = this.SelectionStart; 
      if (start < 1) start = 1; 
      int left = this.Text.LastIndexOf(delimiter, start - 1); 
      int right = this.Text.IndexOf(delimiter, start); 
      if (right == -1) right = Text.Length; 
      this.SelectionStart = left + 1; 
      this.SelectionLength = right - left - 1; 
      return;    
     } 

     base.WndProc(ref m); 
    } 
} 
+0

मैं एकाधिक डिलीमीटर कैसे प्राप्त करूं, क्या आप char [] के साथ एक उदाहरण दे सकते हैं? – DarkPh03n1X

0

DanW के कार्य मैं कई सीमांकक को शामिल किया है, अच्छी तरह से बाहर काम करने लगता है कि करने के लिए पर जोड़ने।

class RichTextBoxX : RichTextBox 
{ 
    private char[] delimiterList = new[] { ',', ' '}; 

    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     if (m.Msg == 0x0203) // WM_LBUTTONDBLCLK 
     { 
      int start = this.SelectionStart; 
      if (start < 1) start = 1; 

      int left = -1; 
      int right = Text.Length; 

      foreach (char c in delimiterList) 
      { 
       if (this.Text.LastIndexOf(c, start - 1) > left) 
       { 
        left = this.Text.LastIndexOf(c, start - 1); 
       } 

       if (this.Text.IndexOf(c, start) < right) 
       { 
        right = this.Text.IndexOf(c, start); 
        if (right == -1) right = Text.Length; 
       } 
      } 

      this.SelectionStart = left + 1; 
      this.SelectionLength = right - left - 1; 
      return; 
     } 

     base.WndProc(ref m); 
    } 
} 

एक और बात: कोड आपके प्रपत्र के "कोड" है कि आप को खींच कर अपने फार्म पर एक RichTextBox ड्रॉप करने के लिए उस पर उपयोग करने के लिए, अब "फार्म डिजाइनर" का उपयोग जा रहे हैं में ऊपर पेस्ट लागू करने के लिए, अब मेरे मामले form1.desigener.cs में प्रपत्र के डिजाइनर वर्ग के लिए जाने के लिए और कार्यान्वयन स्ट्रिंग जैसे लगता है:

this.richTextBox1 = new System.Windows.Forms.RichTextBox(); 

और

this.richTextBox1 = new project.form1.RichTextBoxX(); 

साथ बदलें इस के बाद कि नियंत्रण एक सामान्य RichTex की तरह काम करेगा अतिरिक्त overide सुविधा

1

DarkPh03n1X से बेहतर जवाब लगभग मेरे लिए काम कर रहा था के साथ tBox कार्यान्वयन, लेकिन यह एक बुरा बग है: परिसीमक चरित्र नहीं पाया जा सका है, तो, Text.IndexOf(c, start)-1 वापस आ जाएगी जो right-1 सेट हो जाएगा और फिर if (right == -1) right = Text.Length ट्रिगर्स।

तो अब हमने टेक्स्ट के अंत तक चुना है, भले ही अपेक्षित चयन कम होना चाहिए।शुरुआत मुझे लगता है कि सही ढंग से संभाला जाता है।

मैंने if (right == -1) right = Text.Length हटा दिया है लेकिन && pos != -1 जोड़ा गया है। यहाँ तय संस्करण है:

12.34.56.78 (ab1-2-3-4-5.test-1.example.com) 
Jersey City 
New Jersey 
US, United States 
ASN: Example.com/12345 

मैं कुछ अन्य सीमांकक, तुम क्या जरूरत है का चयन करने के लिए स्वतंत्र महसूस जोड़ लिया है:

class RichTextBoxX : RichTextBox 
{ 
    // implement selection to work with "whole words" on double-click 
    // and without selecting the leading/trailing spaces/blanks/line breaks 
    private char[] delimiterList = new[] { '\n', ',', ' ', '(', ')', '_', '/' }; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203) // WM_LBUTTONDBLCLK 
     { 
      int start = SelectionStart; 
      if (start < 1) start = 1; 

      int left = -1; 
      int right = Text.Length; 
      int pos; 

      foreach (char c in delimiterList) 
      { 
       pos = Text.LastIndexOf(c, start - 1); 
       if (pos > left) left = pos; 

       pos = Text.IndexOf(c, start); 
       if (pos < right && pos != -1) right = pos; 
      } 

      SelectionStart = left + 1; 
      SelectionLength = right - left - 1; 
      return; 
     } 

     base.WndProc(ref m); 
    } 
} 

behavour सत्यापित करने के लिए, यहाँ नमूना पाठ मैं उपयोग कर रहा था है।

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