2012-10-25 39 views
10

Tôi có một hộp văn bản nhiều dòng hiển thị một số giá trị dựa trên dữ liệu được cung cấp, (Thường là một giá trị trên mỗi dòng).Cách lấy giá trị văn bản cụ thể từ hộp văn bản dựa trên vị trí chuột

(Với mục đích có cửa sổ bật lên mẹo công cụ với một số dữ liệu 'thay thế') Tôi muốn nhận từ (hoặc ít nhất là dòng) mà chuột di chuột qua để tôi có thể tìm thấy những gì thay thế để hiển thị.

Tôi có một vài ý tưởng về cách thực hiện điều này với các tính toán dựa trên hộp văn bản và kích thước phông chữ nhưng tôi không phải là con đường đi xuống vì kích thước và phông chữ có thể thay đổi thường xuyên.

Vậy ... Có cách nào để sử dụng vị trí chuột để lấy văn bản hộp văn bản cụ thể không?

Trả lời

6

Đây là giải pháp thay thế. Thêm sự kiện MouseMove này vào Hộp văn bản của bạn:

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

cảm ơn, điều này hoạt động rực rỡ! Tôi thích regex được sử dụng để đá ra không gian màu trắng quá! :) – Jammerz858

+0

Vui vì bạn thích nó. Lưu ý rằng nó không chỉ đơn giản là loại bỏ không gian màu trắng. Nó chỉ giữ những gì Regex xem xét một từ, vì vậy dấu câu và bất cứ điều gì khác không được coi là một từ được loại bỏ. –

3

Sử dụng phương pháp GetCharIndexFromPosition để ánh xạ vị trí của chuột tới chỉ mục trong toàn bộ Văn bản. Từ vị trí đó, tiến triển trái và phải cho đến khi bạn có toàn bộ từ.

Để có được vị trí chuột, hãy sử dụng sự kiện MouseHover để bạn nhận được nó ngay khi nó vẫn còn và không phải mọi lúc (điều đó sẽ làm mọi thứ chậm).

+0

Cảm ơn bạn. Tôi đã đi với đề nghị của bạn bằng cách sử dụng sự kiện di chuột qua mousemove và nó làm cho hiệu ứng thân thiện hơn nhiều. Cảm ơn bạn đã giúp đỡ. – Jammerz858

2

Giải pháp của tôi sử dụng mẹo để đạt được những gì bạn muốn.

Khi bạn nhấp đúp vào bên trong vùng văn bản, nó chọn từ cơ bản.

Vì vậy, sử dụng RichTextBox (TextBox không nhấp nháy trên sự kiện chuột) trên biểu mẫu của bạn, bạn có thể mô phỏng nhấp đúp khi nút chuột giữa được nhấp (giống như từ điển Babylon). Nếu bạn muốn, bạn cũng có thể sử dụng MouseHover thay vì MouseDown. Nó hoạt động.

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

Giải pháp khá hay ... nhưng hơi quá phức tạp đối với yêu cầu. Cảm ơn bạn đã giúp đỡ của bạn mặc dù. – Jammerz858

Các vấn đề liên quan