« OLEドラッグ&ドロップ対応にする方法(オブジェクト編) | トップページ | 記事修正のお知らせ »

2011年2月13日 (日)

TextBox のマウス位置に該当する行・桁位置を求める

短くて済むので、C# Tips というより、覚え書きとして、書き残しておきます。

C#2005 以降を前提としますが、任意のマウス位置から、テキストの文字インデックスを得るものとして、GetCharIndexFromPosition プロパティがあります。また、この文字インデックスにあたる行番号を取得出来る GetLineFromCharIndex プロパティと、指定行番号の先頭文字インデックスを得る GetFirstCharIndexFromLine プロパティを使用すれば、簡単な計算で桁位置も求められます。

具体的な使用例は、以下のとおりです。

private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
    int index = textBox1.GetCharIndexFromPosition(e.Location);
    int line = textBox1.GetLineFromCharIndex(index);
    int column = index - textBox1.GetFirstCharIndexFromLine(line);
    Console.WriteLine("{0}行 {1}桁", line, column);
}

ここでは、MouseDown イベントを使用したので、この様な記述となります。しかし、例えば DrapDrop イベントで使用する場合は、マウスの座標がスクリーン座標となっている為、クライアント座標に変換する必要がある事に注意します。

private void textBox1_DragDrop(object sender, DragEventArgs e)
{
    int index = textBox1.GetCharIndexFromPosition(
        textBox1.PointToClient(new Point(e.X, e.Y)));
    int line = textBox1.GetLineFromCharIndex(index);
    int column = index - textBox1.GetFirstCharIndexFromLine(line);
    Console.WriteLine("{0}行 {1}桁", line, column);
}

« OLEドラッグ&ドロップ対応にする方法(オブジェクト編) | トップページ | 記事修正のお知らせ »

覚え書き」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: TextBox のマウス位置に該当する行・桁位置を求める:

« OLEドラッグ&ドロップ対応にする方法(オブジェクト編) | トップページ | 記事修正のお知らせ »