2012-10-25 16 views
10

与えられたデータに基づいていくつかの値を表示する複数行のテキストボックスがあります(通常は1行に1つの値)。マウスの位置に基づいてテキストボックスから特定のテキスト値を取得する方法

(ツールチップのポップアップに「代替」データが表示されるようにするために)私は、マウスがホバーオーバーしているということを言いたいのですが表示する。

テキストボックスとフォントサイズに基づいて計算する方法をいくつか考えていますが、サイズやフォントが頻繁に変更される可能性があるため、この道を辿ることはありません。

そう...特定のテキストボックステキストを取り込むためにマウスの位置を使用する方法はありますか?

答えて

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

私のソリューションは、あなたが望むものを達成するためにトリックを使用します。

テキスト領域内をダブルクリックすると、下にある単語が選択されます。

フォーム上でRichTextBoxTextBoxがマウスイベントで点滅します)を使用すると、マウスの中央ボタンがクリックされたときに(Babylon辞書のような)ダブルクリックをシミュレートできます。必要ならば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

関連する問題