BCB6(and Delphi)を使ってます。
TRichEditで(TMemoもそうかもしれないけど)、WordWrap=trueの状態で、半角のAを
AAAAAAAAAAA..............
と改行を入れずに数百個入力します。
ここで、そのAの真ん中ぐらいの所にスペースをいれると、カーニングが効いて、見た目で改行してしまいます。
あるいは
AAAAAAAAAAAAA(A)AAAAAAAAAAAAAAAAAAAAA.....
としたいときも、見た目が、
AAAAAAAAAAAAA(A)
AAAAAAAAAAAAAAAAAAAAA.....
のようになってしまいます。
ずばり、カーニングさせないで、単語の途中でもブチッと改行するようにすることは、可能でしょうか?
http://www.microsoft.com/japan/developer/library/vcmfc/_mfc_edit_styles.htm
を見た限りではできなそうです。
たしかに、これでは可能性すら感じませんね。
こんな、簡単で基本的なことなのに
word単位重視の英語圏生まれのソフトだから仕方ないかも
いっそのこと、半角入力を全部自動で全角に変換させて、カーニングしないようにするかな・・・
カーニングの意味が間違ってるような・・・
正確にはそうかもしれませんね。
ま、その機能により引き起こされるということで・・・
カーニングによって引き起こされるのではなくて,WordWrapによってそうなるのですよ。(カーニングとは関係ありません)
すこし、方法を考えてみました。
最初の例で、スペースや'('や')'は、アルファベットと異なり、トークンを分離する Wordの区切り文字 となっています。コレを無効にするということでは、可能でしょうか?
つまり、
AAAAAAAAAAAAAAAA(AAAA)AAAAAA AAAA A AAAA......
なんてのを、すべてアルファベットと同様の一つのWordと思わせてしまうのです。
APIでdeliminatorを変更できるとか・・・
WordWrapをFalseにして、自前で改行位置を調節するしかないのでは?
ヒントになりそうなところを見つけました。
http://www.fides.dti.ne.jp/~tokai/vc/vcchips2.html
http://www.delphi32.com/info_facts/faq/faq_478.asp
これでいいのか、試してみます。
うまくいきました!BCBの例ですが、
int CALLBACK MyEditWordBreakProc(LPTSTR lpch,int ichCurrent, int cch, int code){
return 0;
}
としておいて、wordwrap=trueにして、
RichEdit1->Perform( EM_SETWORDBREAKPROC,0,(LPARAM)MyEditWordBreakProc);
としました。
ヒントのページのコメントをみると、return 0のところをいろいろやると、どの文字をdelimiterにするかより詳しくできるようですが、ちょっと勉強してみます。
初めは、ふつうに右端で折り返す機能があるのではと探していましたが、Q&Aに書いてるうちにdelimiterを変更するという方法を思いつきました。みなさんありがとうございました。
解決とさせていただきます。
誤爆スミマセン。
http://www.delphi32.com/info_facts/faq/faq_478.asp
確かに上記の方法での動作確認しました。
報告ありがとうございました。
とんでもありません。メラトニンさんの発言に助けられたので、またよろしくおねがいします。
ところで、その後一つわかったことがあったので、のせておきます。私と同じ問題でここを見た人が、参考になることがあれば幸いです。
どの文字をdelimiterにするかの設定なんですけど、どうにもうまくいきません。
ネット上にはC++、VB、Delphiなどで、いわゆるMyEditWordBreakProc内の処理について書いてあるページがあるのですが、まったくうまくいかないんです。どうも、これらは古いRichEditコントロールのもので、今のBCB6でのRichEditコントロールver3では正しく動かないようです。
ずっと探した結果、結局MSDNで、正しいコードのサンプルを見つけたので、リンクをおいときます。やっと、みつけたよ〜って感じでした。
http://support.microsoft.com/default.aspx?scid=kb;en-us;273139
これで
TCHAR whitespace[]=TEXT(" \t") ;
TCHAR linebreakers[]=TEXT("\r\n") ;
TCHAR delimiters[]=TEXT("[]();:,.\"'") ;
のとこをいじってくださいな。
ツイート | ![]() |