- PR -

TextBoxでCaret位置を取得するには?

1
投稿者投稿内容
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2005-11-18 10:00
C#.NETでTextBox上のカーソル位置(Caretと言うのですか?)を
取得する方法がわかりません。

良くIDEなどのエディタ上で特定のキーを押すと
補完コードリストが出るような仕組みが有ると思うのですが、
あれと同じようなことがしたくて調べているのですが・・・。

.NET Frameworkは1.1です。

凄く初歩的な質問でしたら、参考になりそうなサイトを教えていただけると
ありがたいです。よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-18 10:13
引用:

おかもとさんの書き込み (2005-11-18 10:00) より:

C#.NETでTextBox上のカーソル位置(Caretと言うのですか?)を
取得する方法がわかりません。


位置ということは、Point で欲しいということでしょうか?
API の GetCaretPos 関数について調べてみてください。

# 仮に、SelectionStart という意味だとすると、SelectionLength があった場合に、
# 先頭にカレットがあるのか、末尾にカレットがあるのかを判断する必要があります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-11-18 10:16
引用:

C#.NETでTextBox上のカーソル位置(Caretと言うのですか?)を
取得する方法がわかりません。


TextBoxBase.SelectionStartでわかるはずです。

引用:

良くIDEなどのエディタ上で特定のキーを押すと
補完コードリストが出るような仕組みが有ると思うのですが、
あれと同じようなことがしたくて調べているのですが・・・。


でもこの機能をテキストボックスをベースにして作成するのは難しいと思う。その位置にコントロールを表示するとしても、スクロール位置やカーソル位置から正確な座標を算出するのは結構面倒。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-11-18 10:22
この場合、位置ってのはPoint構造体で表される値ですかね。
RichTextBoxにはGetPositionFromCharIndexメソッドが実装されています。
//ちなみにこのメソッドは.NET 2.0でTextBoxBaseにも追加されたため、TextBoxでも使用できるようになりました。
また、文書の先頭と現在のキャレットの間の文字数はSelectionStartで取得できます。
以上のことから、RichTextBoxでは容易にPointが取得できるでしょう。

で、問題は.NET 1.1までのTextBoxですが。
GetPositionFromCharIndexメソッドが使えないので、その代わりにEM_POSFROMCHARメッセージを使用する必要があります。
手前みそですがこのメッセージを実装させてみた記事です。
http://hongliang.seesaa.net/article/7169928.html
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-18 10:40
引用:

甕星さんの書き込み (2005-11-18 10:16) より:

TextBoxBase.SelectionStartでわかるはずです。


先にも書かせて頂きましたが、たとえば、2 文字目から 5 文字目までを選択している場合は、
カレットの位置は 5 文字目の後ろにあるのですが「1」が返ります。
SelectionStart プロパティは、無条件で先頭の選択開始位置を返します。
カレット位置を返すわけではありませんよね。

RichTextBox でも、GetPositionFromCharIndex に与える index を求めるまでがタイヘンだと思います。(;--)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2005-11-18 11:29
短時間のうちにこれほどアドバイスが有るとはありがたいです。

まずはじゃんぬねっとさんと甕星さんに教えていただいたSelectionStartを
試してみました。

じつは、このプロパティは知っていたのですが、マウスなどでテキストを
選択した状態の取得設定するものだと思っていました。単にカレットが
そこに有るだけでも"選択"と言うのですね。勉強になります。

あと、じゃんぬねっとさんが最初に言われたGetCaretPos についてはWin32API
と言う事で、まったくの盲点でした。.NETになってもWin32APIは普通に
使われているのでしょうか?
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-11-18 11:39
引用:

Hongliangさんの書き込み (2005-11-18 10:22) より:
RichTextBoxにはGetPositionFromCharIndexメソッドが実装されています。
//ちなみにこのメソッドは.NET 2.0でTextBoxBaseにも追加されたため、TextBoxでも使用できるようになりました。


お〜素晴らしいです。知りませんでした。EM_POSFROMCHARってコントロールのバージョンや、RichEditとEditBoxで挙動が違うので、自前で実装するの面倒なんですよね。

引用:

じゃんぬねっとさんの書き込み (2005-11-18 10:22) より:
RichTextBox でも、GetPositionFromCharIndex に与える index を求めるまでがタイヘンだと思います。(;--)


GetCharFromPositionとGetCaretPos APIになるのかな・・・。
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2005-11-18 13:43
結局、Hongliangさんの言われるようにRichTextBoxで簡単に
出来るようなので、GetPositionFromCharIndexとSelectionStartの
組み合わせで対応しました。現段階ではTextBoxにこだわる必要が
無いので、メッセージを使用する方法は参考にさせてもらうだけに
します。(今のところメッセージとか言われても良く分からないので・・・)

Hongliangさん、ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)