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

リッチテキスト内のカーソル位置の取得

環境/言語:[.NET Framework1.1 C#]
分類:[.NET]

こんにちは。

リッチテキストとトラックバーを利用して
テキストファイルの「秀丸」のような機能を作成したいのですが
以下の点で苦戦しているのでどなたか教えていただけませんか?

・テキストボックス内でカーソル位置が変わる度にトラックバーの位置も変えたい。
 (バーの目盛りは文字のバイトごとにしたい)
・テキストボックスにカーソルを置いただけでもその位置を知りたい。

とりあえず、richTextBox1_TextChanged内で
label1.Text = richTextBox1.SelectionStart.ToString();
↑の処理は出来るのですが・・・
カーソルの位置が変わったのを知るという動きをどう処理に加えたらいいのか分かりません

超初心者ですが、よろしくお願いします
こんばんは、ひまわりさん。ピラルクです。

_TextChangedよりは_SelectionChangedの方でしょう。
この行のn文字目の取り方がちょっと?です。
以下の例はパフォーマンス悪いです。改良を試みてください。
バイトごとはUnicodeだと単純に文字数*2なので、多分
WindowsPlatformファイルに書き出した場合のMS932の
バイトのことととらえました。

private void richTextBox1_SelectionChanged(object sender, System.EventArgs e)
{
int pos = richTextBox1.SelectionStart;
int totallen = richTextBox1.TextLength;
int totalline = richTextBox1.Lines.Length - 1;
int line = richTextBox1.GetLineFromCharIndex(pos);
String sLine = richTextBox1.Lines[line];
int linelen = sLine.Length;
int col = pos;
for (int i = 0; i < totalline && i < line; i++)
{
col -= richTextBox1.Lines[i].Length + 1; // +1=改行
}

label1.Text = String.Format(
"{0}行/全{1}行\n" +
"この行の{2}文字目/この行は全{3}文字\n" +
"全体の{4}文字目/全体で{5}文字\n" +
"MS932(≒S_JIS)では、この行の{6}byte目/この行は全{7}byte\n",
line + 1, totalline + 1,
col, linelen,
pos, totallen,
Encoding.GetEncoding(932).GetByteCount(sLine.Substring(0, col)),
Encoding.GetEncoding(932).GetByteCount(sLine));
}
ピラルクさん、ありがとうございます

教えていただいたやり方で動かすと出来ました☆
本当にありがとうございます。

少し、今回の分に改良を加えて理想の形に仕上げられるよう頑張ります。
解決済み!

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