- ベストアンサー
リッチエディットコントロールでの折り返しについて
開発環境はBCC 5.5、OSはWindows 98 SEです。 テキストを編集するWindowsアプリケーションを作成していて、 リッチエディットコントロールの一行に入力できる文字数を制限したいのですが、 どうすればいいのか、よくわかりません。 横にスクロールできる上で、自動改行をさせようと思います。 折り返しの文字数(byte単位でも何でも)を指定する方法をご存知の方がいらっしゃれば、 ご教授おねがいします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> しかし、それではテキストを保存する時に、 > 改行コードごと保存してしまいそうなのですが… 自動改行の部分には何らかの目印を付けておいて、保存時に削除すればよいです。 CEdit::FmtLines の解説によると、「2 つのキャリッジ リターンと 1 つのラインフィードから成るソフト改行が単語分割された行の終わりに挿入されます。ハード改行は、1 つのキャリッジ リターンと 1 つのラインフィードから成ります。」だそうです。 がんばって実装してください。
その他の回答 (4)
- yonfa
- ベストアンサー率52% (22/42)
#2&3です。 よく調べてみたら、EM_SETRECT なるものがありました。 画面上の表示領域とは別に、書式領域を設定するものです。 コントロールに表示する文字フォントが固定幅であれば、(文字数×文字幅)を領域幅に設定すれば要望通りの動作をするかもしれません。
補足
Windows 98だからなのか、リッチエディットだからなのかわかりませんが、 どうも、私の環境ではEM_SETRECTは動作しませんでした。 また、EM_SETRECTでは、表示できる領域を制限するだけで、 その制限を越えて入力した場合にはスクロールバーが表示されて、 そのまま入力できるらしいです。 http://www.winapi-database.com/tips/40/
- Oh-Orange
- ベストアンサー率63% (854/1345)
★回答者 No.1 です。 ・私のリンク項目で紹介した『EM_FMTLINES』による『ソフト改行文字を挿入する』で 質問者さんの問題は解決しそうですが…。 抜粋:ソフト改行文字とは ・テキストボックスに標準で用意されたワードラップ機能 (テキストボックスの右端で折り返す機能)において、ソフト的に 付加された改行文字を指す。ソフト的に負荷されるだけなので 表示されないし、テキストにも影響しない。 ・EM_FMTLINES を使うと、ソフト改行文字を 実際の改行文字に変換できる。 ・となっています。 ・回答者 No.3 さんの『CEdit::FmtLinesの解説』より、ソフト改行は 『2 つのキャリッジ・リターンと、1 つのラインフィードから成る』 との事です。つまり、通常の改行が『\r\n』ですが、ソフト改行は 『\r\r\n』という事になります。 ・以上。回答というよりアドバイスでした。 ・がんばって下さいね。
- yonfa
- ベストアンサー率52% (22/42)
EM_LIMITTEXT で文字数制限をすると、一行しか入力できなくなります。 #1 さんのおっしゃるように、自分で各行の文字数をチェックして改行コードを挿入するしかなさそうです。 チェックするタイミングとしては、コントロールに EN_CHANGE メッセージが送られた時ということになります。 つまり、一文字入力されるごとに行の文字数をチェックして処理することとなります。 勝手に改行するのはよいのですが、編集で行の文字数が減った場合、次の行と連結しなおして、再度改行コードを挿入しなおすという処理が必要な気がします。 しかも、ユーザが自分で改行した場合(自動改行でない)は、次の行との連結・改行はしないといった考慮も必要になるかと思います。 つまるところ、かなり面倒くさいです。 一行の文字数を制限したい理由はわかりませんが、入力された内容を保存するなどで次の処理に渡す段階で改行を挿入するようにしたほうが、簡単に実装できると思います。
お礼
ご回答ありがとうございます。 やはり、自分で改行コードを挿入するしかないのでしょうか? しかし、それではテキストを保存する時に、 改行コードごと保存してしまいそうなのですが… とりあえず、やってみることにします。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★1行に入力できる文字数の制限だけはアドバイスします。 ・リッチエディットの『EM_GETLIMITTEXT』メッセージで制限できます。 サンプル: SendMessage( Edit.hWnd, EM_LIMITTEXT, 制限文字数, 0 ); ←リッチエディットのウインドウハンドルの場合 SendDlgItemMessage( hWnd, IDC_RICEDIT, EM_LIMITTEXT, 制限文字数, 0 ); ←ダイアログのコントロールの場合 最後に: ・自動改行の場合はサブクラス化すると出来ます。 ・また、入力されている行を取得して自分で文字数を数え、指定の文字数を超えていたら改行コードを 挿入して、入力された行へ文字列を設定する方法が考えられます。が、サブクラス化にくらべ複雑です。 ・もちろん、サブクラス化した場合も文字数を数えたりして制御(改行挿入)しますが…。 ・あっ、EM_FMTLINES というメッセージを見つけました。→説明によると 『複数行テキストボックスにおいて、ソフト改行文字を設定・削除する』とあります。 これを使えば良さそうですね。 ・以上。おわり。 リンク: ・http://www.winapi-database.com/Message/EM/EM_LIMITTEXT.html→『入力可能なバイト数を設定する』 ・http://www.winapi-database.com/Message/EM/EM_FMTLINES.html→『複数行テキストボックスにおいて、ソフト改行文字を設定・削除する』
補足
私の説明が悪かったようです。 「一行に入力できる文字数の制限」ではなく、 「複数行のリッチエディットにおいて、何桁目で折り返すか」ということでした。 すいません。
お礼
なるほど、そういう手があったんですね。 なんとか、保存時に削除するようにはできました。 ソフト改行を挿入するのもがんばってみます。