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

テキストボックスの改行に関して

環境/言語:[Windows.XP VB.Net2003]
分類:[.NET]

いつもお世話になっております。
beanjam@超初心者です。

テキストボックスで、Word WrapプロパティーをTrueにしていると
テキストボックスに入力すると、入力文字列が改行して提示されますよね。
このとき、テキストボックス上でカーソルが2行目にあるように見えても
改行文字を挿入したわけではないので、
Line()の値は、0となる(1行目として処理される)、
ということが起こりますよね。

これを、Ward WrapがTrueのテキストボックス上で、
3行目にある(ように見える)カーソルが、
実際にLine(2)にあるように処理することは可能でしょうか??

可能でしたら、その方法についてアドバイスを戴ければありがたいのですが・・・
質問の意図がわかりにくくて申し訳ないのですが、よろしくお願いいたします。

というのも、現在、テキスト入力用のモードと
カーソル移動のためのモードと2つのモードがある
テキストボックスを作成していて、
カーソル移動モードの時には”j”キーを押すと、
カーソルがひとつ下に移動するようにしたいと思っています。
(“j”キーに“↓”矢印キーの働きをさせる)

最初、一行の文字数を20と考えて
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As
    System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
Dim s = TextBox1.SelectionStart ’sはカーソル位置

If e.KeyChar = "j" Then       ’jキーが押されたら
TextBox1.SelectionStart = s + 20
                 ’↑カーソルが20文字分移動する
e.Handled = True
End If

End Sub

としていたのですが、Word Wrapでの改行は、
句読点や単語の切れ目になるところを避けて改行するので
厳密に一行が20字で表示されることがなく、
少しずつずれていってしまいます・・・

そこで、行数を取得してカーソル位置を変更する必要があると考えたのですが
最初に述べたように、改行文字を挿入しているわけではないので、
プログラム上で行数を操作できずに詰まっている状況です。


長々と申し訳ございません。
説明のしかたが難しくて、文章もわかりにくいと思うのですが
何かアドバイスがありましたらよろしくお願いいたします。
> これを、Ward WrapがTrueのテキストボックス上で、
> 3行目にある(ように見える)カーソルが、
> 実際にLine(2)にあるように処理することは可能でしょうか??

 自動改行されている位置を取得することは可能なので、お望みの内容に近い処理をすることはできるかと思いますが‥‥

> カーソル移動モードの時には”j”キーを押すと、
> カーソルがひとつ下に移動するようにしたいと思っています。
> (“j”キーに“↓”矢印キーの働きをさせる)

という目的なのでしたら、 SendKeys を使うなり他の手段を模索した方が良さそうな気がします。文字数で判定していると表示文字幅の違いに対応できませんし。<勿論、不可能という訳ではないですけど。


 当初の方向性でいかれるのでしたら、 EM_FMTLINES メッセージについてお調べください。
■No7979に返信(深山さんの記事)

返信が遅くなりすみません。


わかりやすく、丁寧なアドバイスありがとうございました!

文字数をカウントするという考えにとらわれていて、
キーストロークを送信する、という方法に気づいておりませんでしたが

「本来のjキーを無効にし、SendKeys.Send()メッソド
で↓に相当する制御コードを送る。」

というコードを考えれば良かったのですね!
目からうろこという感じです。
(レベルが低い発見で申し訳ないのですが^^;)
SendKeys.Send も今まで使った事がありませんでした。


無事解決できました。
ありがとうございます。
これからもよろしくお願いいたします。


<改訂コード>
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As
    System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
Dim s = TextBox1.SelectionStart ’sはカーソル位置

If e.KeyChar = "j" Then       
SendKeys.Send("{DOWN}")

e.Handled = True
End If
解決済み!

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