C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: TextBoxでスクロールせずに全選択状態にしたい


(過去ログ 84 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■50004 / inTopicNo.1)  TextBoxでスクロールせずに全選択状態にしたい
  
□投稿者/ きゃむ (1回)-(2010/05/26(Wed) 13:38:18)

分類:[C#] 

環境 Vista VS2008 Pro

Windows FormのTextBoxで、Textの文字列長さが、そのTextBoxの幅より長い場合(改行などもしない場合)について質問です。

通常、プログラムからその文字列を全選択すると、キャレット(カーソル)が文字列の末尾にきて文字列も末尾までスクロールされます。
これを、文字列がスクロールしないままの状態で全選択にしたいのですが、簡単にできそうでなかなか実現できません。

SelectionStartとSelectionLenth、あるいはSelect()メソッドや、ScrollToCaret()メソッドなど、いろいろ試しましたが、
全てキャレットが末尾にきて文字列がスクロールされてしまうため、実現に至りませんでした。
せめて選択状態でキャレットを先頭に設定できるならScrollToCaret()で実現できるのですが。。。

アプリケーションの実行時なら、ユーザーがマウスで文字列の末尾を選択し、ドラッグして先頭まで選択すれば、その状態が実現できます。
これをプログラムのコードのみで実現したいのです。
ちなみに全選択状態でのキャレットの位置はどこでも構いません。
何か良い方法がありましたら宜しくお願い致します。
引用返信 編集キー/
■50006 / inTopicNo.2)  Re[1]: TextBoxでスクロールせずに全選択状態にしたい
□投稿者/ Hongliang (636回)-(2010/05/26(Wed) 14:59:08)
選択前に EM_GETSCROLLPOS でスクロール位置を取得しておき、選択後に EM_SETSCROLLPOS で選択前のスクロール位置に戻す、って感じですかね。
引用返信 編集キー/
■50007 / inTopicNo.3)  Re[1]: TextBoxでスクロールせずに全選択状態にしたい
□投稿者/ 魔界の仮面弁士 (1660回)-(2010/05/26(Wed) 15:02:29)
No50004 (きゃむ さん) に返信
> 文字列がスクロールしないままの状態で全選択にしたいのですが、簡単にできそうでなかなか実現できません。
> アプリケーションの実行時なら、ユーザーがマウスで文字列の末尾を選択し、ドラッグして先頭まで選択すれば、その状態が実現できます。

もし、最初から少しだけスクロールされている状態から始めた場合、“末尾から先頭”を選択すると
文字列が先頭にスクロールされてしまう事になりますが、それは構わないのでしょうか。

> これをプログラムのコードのみで実現したいのです。
せいぜい、キーストロークを送信することぐらいしか思いつきません…。

textBox1.Focus();
textBox1.SelectionStart = textBox1.TextLength;
SendKeys.SendWait("+{HOME}");
引用返信 編集キー/
■50008 / inTopicNo.4)  Re[1]: TextBoxでスクロールせずに全選択状態にしたい
□投稿者/ kic (1回)-(2010/05/26(Wed) 15:05:33)
2010/05/26(Wed) 15:10:32 編集(投稿者)
2010/05/26(Wed) 15:07:58 編集(投稿者)

> アプリケーションの実行時なら、ユーザーがマウスで文字列の末尾を選択し、ドラッグして先頭まで選択すれば、その状態が実現できます。

これをSendKeysでやっちゃうとか。

textBox1.Focus();
textBox1.SelectionStart = textBox1.Text.Length;
SendKeys.Send( "+{HOME}" );


・・遅かった。



引用返信 編集キー/
■50009 / inTopicNo.5)  Re[2]: TextBoxでスクロールせずに全選択状態にしたい
□投稿者/ 魔界の仮面弁士 (1661回)-(2010/05/26(Wed) 15:17:51)
No50006 (Hongliang さん) に返信
> 選択前に EM_GETSCROLLPOS でスクロール位置を取得しておき、選択後に EM_SETSCROLLPOS で選択前のスクロール位置に戻す、って感じですかね。

その場合は、TextBox を RichTextBox に差し替える必要がありますね。

//private const int EM_GETSCROLLPOS = 0x04DD;
private const int EM_SETSCROLLPOS = 0x04DE;

[DllImport("USER32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wp, ref Point lp);

private void button1_Click(object sender, EventArgs e)
{
 Point pt = Point.Empty;
 richTextBox1.SelectAll();
 SendMessage(richTextBox1.Handle, EM_SETSCROLLPOS, 0, ref pt);
}
引用返信 編集キー/
■50010 / inTopicNo.6)  Re[3]: TextBoxでスクロールせずに全選択状態にしたい
□投稿者/ Hongliang (637回)-(2010/05/26(Wed) 15:32:35)
> その場合は、TextBox を RichTextBox に差し替える必要がありますね。
ありゃ、何故か RichTextBox の話と勘違いしてました。

TextBox なら、選択前に EM_GETFIRSTVISIBLELINE で先頭行を取得しておいて、選択後に EM_LINESCROLL で(選択前の先頭行 - 現在の先頭行) だけスクロール、かな。
// 横スクロールは確か TextBox では出なかったですよね?
引用返信 編集キー/
■50026 / inTopicNo.7)  Re[2]: TextBoxでスクロールせずに全選択状態にしたい
□投稿者/ きゃむ (2回)-(2010/05/26(Wed) 19:52:38)
皆様、目からウロコのご回答を頂きありがとうございます!!
SendKeysの方法、SendMessageの方法、いずれも単体として希望の動作を実現できることが確認できました。

実際には今回のテキストボックスはシングルラインで使用するため、
マルチラインでないとSendMessageのEM_LINESCROLLが効かなかったので、
SendKeysの方法を使うことにしました。


どうもありがとうございました。大変助かりました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -