DOBON.NET DOBON.NETプログラミング掲示板過去ログ

RichTextBox内のクリックした位置

環境/言語:[VB.NET 2002]
分類:[.NET]

フォームにRichTextBoxがあり、そのRichTextBox内には、

AAA
BBB
CCC
DDD
EEE

と5行文字列が入っています。
文字列をクリックしたとき、BBBなら2、DDDなら4というように、
それが何行目なのかを取得したいのですが、
どのようにしたらよいのでしょうか。

一応自分が考えた方法としては、
RichTextBoxのMouseDownイベントがあったとき、
MousePosition.YとMe.Topとの差で算出するようにし、一応実現できたのですが、
開発環境がXPだったため、
フォームのタイトルバーの高さがXPテーマ無効時や他Windowsと異なり、
それによりすべてのコントロールの位置がずれてしまうため、うまく行きません。
Me.TopとRichTextBox.Topとの差を見ればよいような気も一瞬したのですが、
テーマが無効になるとコントロールのTopが変わるという訳ではないのでできません。
何かよい方法はないでしょうか。
■No7974に返信(smithさんの記事)

おはようございます。
RichTextBox にはこの問題に対処する便利なメソッドが
標準で準備されています。
再度RichTextBox のメソッドを確認してください。
> RichTextBox にはこの問題に対処する便利なメソッドが
> 標準で準備されています。
> 再度RichTextBox のメソッドを確認してください。

メソッド一覧をもう一度すべて見直してみましたが、
指定した文字列の位置(行番号)を取得するものはあったものの、
クリックした位置やカレットの位置を取得するようなものはありませんでした。
RichTextBoxに何が入っているのか不明で、常に変化するため、
文字列を指定することはできません。
ちょっと説明不足だったかもしれません。すみません。
> メソッド一覧をもう一度すべて見直してみましたが、
> 指定した文字列の位置(行番号)を取得するものはあったものの、
> クリックした位置やカレットの位置を取得するようなものはありませんでした。
> RichTextBoxに何が入っているのか不明で、常に変化するため、
> 文字列を指定することはできません。
> ちょっと説明不足だったかもしれません。すみません。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsrichtextboxclassgetcharindexfrompositiontopic.asp

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsrichtextboxclassgetcharfrompositiontopic.asp

これらが使えそうな気がします。
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsrichtextboxclassgetcharindexfrompositiontopic.asp
>
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsrichtextboxclassgetcharfrompositiontopic.asp

これらも、結局文字列を検索して位置を取得するので、
RichTextBoxに何が入っているのか分からず、常に変化する場合は使えないと思います。
いろいろと実験した結果、結局一番初めに自分が考えた方法の改良でできました。
MousePositionからマウスカーソルの位置を取得すると画面全体に対する座標が出、
そのためMe.Topとの差で算出するとXPテーマによるフォームのタイトルバーの高さの分のずれが出ていたようです。
フォームに対するマウスカーソルの位置でやるようにしたら、
Me.Topとの差を計算する必要もなくなり、
XPテーマ有効時も無効時もクリック時に取得される値が同じになりました。
今回は自己解決してしまいましたが、また何かありましたらよろしくお願いします。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板