2012-10-25 11 views
10

के आधार पर टेक्स्टबॉक्स से विशिष्ट टेक्स्ट मान कैसे प्राप्त करें मेरे पास एक बहु-पंक्ति टेक्स्ट बॉक्स है जो दिए गए डेटा के आधार पर कुछ मान प्रदर्शित करता है, (आम तौर पर प्रति पंक्ति एक मान)।माउस स्थिति

(कुछ 'वैकल्पिक' डेटा के साथ टूल टिप पॉपअप रखने के उद्देश्य से) मैं शब्द (या कम से कम लाइन पर) प्राप्त करना चाहता हूं कि माउस ऊपर हो रहा है, इसलिए मैं कौन सा विकल्प ढूंढ सकता हूं प्रदर्शित करने के लिए।

मेरे पास टेक्स्ट बॉक्स और फ़ॉन्ट आकारों के आधार पर गणना के साथ ऐसा करने के कुछ विचार हैं, लेकिन मुझे इस सड़क पर जाने के लिए क्या नहीं है क्योंकि आकार और फ़ॉन्ट अक्सर बदल सकते हैं।

तो ... क्या विशिष्ट टेक्स्ट बॉक्स टेक्स्ट को पकड़ने के लिए मकान की स्थिति का उपयोग करने का कोई तरीका है?

उत्तर

6

यहां एक वैकल्पिक समाधान है। इस MouseMove ईवेंट को अपने टेक्स्टबॉक्स में जोड़ें:

private void txtHoverWord_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (!(sender is TextBox)) return; 
    var targetTextBox = sender as TextBox; 
    if(targetTextBox.TextLength < 1) return; 

    var currentTextIndex = targetTextBox.GetCharIndexFromPosition(e.Location); 

    var wordRegex = new Regex(@"(\w+)"); 
    var words = wordRegex.Matches(targetTextBox.Text); 
    if(words.Count < 1) return; 

    var currentWord = string.Empty; 
    for (var i = words.Count - 1; i >= 0; i--) 
    { 
     if (words[i].Index <= currentTextIndex) 
     { 
      currentWord = words[i].Value; 
      break; 
     } 
    } 
    if(currentWord == string.Empty) return; 
    toolTip.SetToolTip(targetTextBox, currentWord); 
} 
+0

धन्यवाद, यह शानदार ढंग से काम करता है! मुझे रेगेक्स भी पसंद आया जो सफेद जगह को बाहर निकालने के लिए भी इस्तेमाल किया जाता था! :) – Jammerz858

+0

खुशी है कि आपको यह पसंद आया। ध्यान दें कि यह केवल सफेद स्थान को नहीं हटाता है। यह केवल रेगेक्स को एक शब्द मानता है, इसलिए विराम चिह्न और किसी अन्य शब्द को एक शब्द नहीं माना जाता है। –

3

पूरे पाठ में किसी सूचकांक में माउस की स्थिति को मैप करने के लिए GetCharIndexFromPosition विधि का उपयोग करें। उस स्थिति से, जब तक आपका पूरा शब्द न हो तब तक प्रगति बाएं और दाएं।

माउस की स्थिति प्राप्त करने के लिए, MouseHover ईवेंट का उपयोग करें, ताकि आप इसे तब भी प्राप्त कर सकें जब यह अभी भी न हो और हर बार (इससे चीजें धीमी हो जाएंगी)।

+0

धन्यवाद। मैं माउस होवर घटना का उपयोग mousemove पर करने के आपके सुझाव के साथ गया और यह प्रभाव को और अधिक उपयोगकर्ता के अनुकूल बनाता है। आपकी सहायता के लिए धन्यवाद. – Jammerz858

2

मेरा समाधान आप जो चाहते हैं उसे हासिल करने के लिए एक चाल का उपयोग करता है।

जब आप किसी टेक्स्ट क्षेत्र के अंदर डबल क्लिक करते हैं, तो यह अंतर्निहित शब्द का चयन करता है।

तो RichTextBox (TextBox माउस इवेंट्स पर फ्लैश करता है) का उपयोग करके आप अपने फॉर्म पर डबल क्लिक अनुकरण कर सकते हैं जब मध्य माउस बटन क्लिक किया जाता है (बाबुल शब्दकोश की तरह कुछ)। यदि आप चाहते हैं कि MouseDown के बजाय आप MouseHover का भी उपयोग कर सकते हैं। यह काम करता हैं।

public partial class Form3 : Form 
    { 
     System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 

     public Form3() 
     { 
      InitializeComponent(); 
      timer.Interval = 50; 
      timer.Tick += timer_Tick; 
     } 

     void timer_Tick(object sender, EventArgs e) 
     { 
      timer.Stop(); 
      MessageBox.Show(richTextBox1.SelectedText); 

      // do more stuff here, e.g display your tooltip for the selected word or anything else 

      richTextBox1.SelectionLength = 0; // remove the highlighted color of selection 
     } 

     [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
     public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo); 

     private const uint MOUSEEVENTF_LEFTDOWN = 0x02; 
     private const uint MOUSEEVENTF_LEFTUP = 0x04; 
     private const uint MOUSEEVENTF_RIGHTDOWN = 0x08; 
     private const uint MOUSEEVENTF_RIGHTUP = 0x10; 

     public void DoMouseDoubleClick() 
     { 
      //Call the imported function with the cursor's current position 
      uint X = (uint)Cursor.Position.X; 
      uint Y = (uint)Cursor.Position.Y; 

      mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0); 
      mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0); 
      mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0); 
      mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0); 

      timer.Start(); // some delay is required so that mouse event reach to RichTextBox and the word get selected 
     } 

     private void richTextBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Middle) 
      { 
       DoMouseDoubleClick(); 
      } 
     } 
    } 
+0

बहुत अच्छा समाधान ... लेकिन आवश्यकता के लिए थोड़ा बहुत जटिल है। यद्यपि आपकी मदद के लिए धन्यवाद। – Jammerz858

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