- - PR -
TextBoxでCaret位置を取得するには?
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-18 10:00
C#.NETでTextBox上のカーソル位置(Caretと言うのですか?)を
取得する方法がわかりません。 良くIDEなどのエディタ上で特定のキーを押すと 補完コードリストが出るような仕組みが有ると思うのですが、 あれと同じようなことがしたくて調べているのですが・・・。 .NET Frameworkは1.1です。 凄く初歩的な質問でしたら、参考になりそうなサイトを教えていただけると ありがたいです。よろしくお願いします。 | ||||||||
|
投稿日時: 2005-11-18 10:13
位置ということは、Point で欲しいということでしょうか? API の GetCaretPos 関数について調べてみてください。 # 仮に、SelectionStart という意味だとすると、SelectionLength があった場合に、 # 先頭にカレットがあるのか、末尾にカレットがあるのかを判断する必要があります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-11-18 10:16
TextBoxBase.SelectionStartでわかるはずです。
でもこの機能をテキストボックスをベースにして作成するのは難しいと思う。その位置にコントロールを表示するとしても、スクロール位置やカーソル位置から正確な座標を算出するのは結構面倒。 | ||||||||
|
投稿日時: 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 | ||||||||
|
投稿日時: 2005-11-18 10:40
先にも書かせて頂きましたが、たとえば、2 文字目から 5 文字目までを選択している場合は、 カレットの位置は 5 文字目の後ろにあるのですが「1」が返ります。 SelectionStart プロパティは、無条件で先頭の選択開始位置を返します。 カレット位置を返すわけではありませんよね。 RichTextBox でも、GetPositionFromCharIndex に与える index を求めるまでがタイヘンだと思います。(;--) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-11-18 11:29
短時間のうちにこれほどアドバイスが有るとはありがたいです。
まずはじゃんぬねっとさんと甕星さんに教えていただいたSelectionStartを 試してみました。 じつは、このプロパティは知っていたのですが、マウスなどでテキストを 選択した状態の取得設定するものだと思っていました。単にカレットが そこに有るだけでも"選択"と言うのですね。勉強になります。 あと、じゃんぬねっとさんが最初に言われたGetCaretPos についてはWin32API と言う事で、まったくの盲点でした。.NETになってもWin32APIは普通に 使われているのでしょうか? | ||||||||
|
投稿日時: 2005-11-18 11:39
お〜素晴らしいです。知りませんでした。EM_POSFROMCHARってコントロールのバージョンや、RichEditとEditBoxで挙動が違うので、自前で実装するの面倒なんですよね。
GetCharFromPositionとGetCaretPos APIになるのかな・・・。 | ||||||||
|
投稿日時: 2005-11-18 13:43
結局、Hongliangさんの言われるようにRichTextBoxで簡単に
出来るようなので、GetPositionFromCharIndexとSelectionStartの 組み合わせで対応しました。現段階ではTextBoxにこだわる必要が 無いので、メッセージを使用する方法は参考にさせてもらうだけに します。(今のところメッセージとか言われても良く分からないので・・・) Hongliangさん、ありがとうございました。 |
1