- - PR -
TextBoxの表示が単語単位に自動改行される挙動を変更したい
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-04-02 13:16
いつも拝見させて頂いておりますが投稿は初めてです。
よろしくお願い致します。 C#のTextBoxコントロールを Multiline = true; WordWrap = true; として使用しているのですが、 表示上の改行が「単語単位」で折り返されてしまいます。 (標準の挙動だと思います) これを単語の途中であってもかまわないので、 「表示エリアの右端」で改行されるようにしたいのですが、 実現方法がわかりません。 一応「WordBreak」「WordWrap」「改行」等のワードで過去ログを拝見させて頂いて、 実際のテキスト自体に改行を追加すれば実現できそうではありますが、 (表示エリアの横幅からテキスト長を算出して、改行コードをインサートする等して、 その際には泣き別れのような別の問題も発生しますが) できれば改行を追加しない方法で実現したいと考えております。 目論見としてはTextBoxを継承したクラスで 改行を制御(正確には表示上次の行へLFする制御?)しているような メソッドをOverrideするのかな?と考えているのですが、、 判り難い文章で申し訳ございませんが、 どうぞよろしくお願い致します。 | ||||||||
|
投稿日時: 2007-04-02 15:17
WordWrap=trueはそういう指示ですけど・・・
WordWrap=falseではうまくいきませんか? #動作確認していないので判断がつかないのですが、 #実は質問の書き間違いで、WordWrap=falseにしているけどうまくいかない #という質問だったりするのかもしれない・・・ | ||||||||
|
投稿日時: 2007-04-02 15:29
おっしゃるようにWordWrapはそういう意味なのは理解しているのですが、
これをFalseにすると表示エリアをはみ出しても改行されなくなってしまいます。 (エリア外に突き抜ける感じです。スクロールバーを有効にしておくと自動的に付与される状態です) 表示エリア内で自動的に改行されて欲しいけど、 単語単位で改行されたくない。 という動作を実現したいのですが・・ 私何かとても基本的な事を見落としているのでしょうか? | ||||||||
|
投稿日時: 2007-04-02 15:55
>#実は質問の書き間違いで 申し訳ありません。私の読み間違い&WordWrap=Falseの動作勘違いでしたね。。。 #動作検証せずにレスするとこういうことに・・・orz APIのSendMessage関数とEM_SETWORDBREAKPROCメッセージを使用して 独自のワードラップを実装すればいけそうな気がしますが、 今回もまた未検証です。 | ||||||||
|
投稿日時: 2007-04-02 17:21
VBですがテストプログラムを作ってみました。 一応それなりに動作しているようですが、十分な検証はしていません。 正式な情報源はたぶん英語しかありませんが、これらのドキュメントを 熟読せず作ってますし、怪しい部分もありますので、 参考にされる場合は、十分な調査と検証を行ってください。 EM_SETWORDBREAKPROC http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/editcontrols/editcontrolreference/editcontrolmessages/em_setwordbreakproc.asp EditWordBreakProc コールバック http://msdn2.microsoft.com/en-us/library/ms672125.aspx | ||||||||
|
投稿日時: 2007-04-02 17:33
よねKEN様
わざわざコードまで書いて頂いて恐縮です。 ありがとうございます。 私にVBの知識が乏しい為判らない部分もありますが、 頂いたコードと参考リンクを元にC#での実装を行ってみようと思います。 まずは頂いたコードが何をしているのか調べる所から始めますので、 時間がかかるかもしれませんが、進展がございましたらまた報告させて頂きます。 | ||||||||
|
投稿日時: 2007-05-07 16:26
最後の書き込みから一月以上経過してからのレスで恐縮ですが
(別の作業をしており手がつけられませんでした) 下記のようなコードで対応することができました。 --------------------------------------------------------------------------- TextBoxを継承したクラスで、 // 定数とデリゲートの定義 private const int EM_SETWORDBREAKPROC = 0x00D0; private delegate int EditWordBreakProc( IntPtr lpch, int ichCurrent, int cch, int code ); [DllImport("user32.dll")] extern static IntPtr SendMessageW( IntPtr hWndControl, int msgId, IntPtr wParam, EditWordBreakProc lParam ); // 改行制御処理(常に制御しない) private int MyEditWordBreakProc( IntPtr lpch, int ichCurrent, int cch, int code ) { return ichCurrent; } // 改行制御処理セット private void setNoWordWrap() { SendMessageW( this.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, new EditWordBreakProc( MyEditWordBreakProc ) ); } // プロパティの上書き public override bool Multiline { set { base.Multiline = value; setNoWordWrap(); } } --------------------------------------------------------------------------- 現状期待したように動作しております。 よねKEN様 本当にありがとうございました。 | ||||||||
|
投稿日時: 2007-05-07 16:59
上書き? なんかオーバーライトと勘違いしている人最近多いな・・・ |
1