リッチテキストでカーニングさせない方法は存在する?

解決


賭博アルプス王ハイジ  2005-04-09 05:04:37  No: 14170  IP: [192.*.*.*]

BCB6(and Delphi)を使ってます。

TRichEditで(TMemoもそうかもしれないけど)、WordWrap=trueの状態で、半角のAを

AAAAAAAAAAA..............


と改行を入れずに数百個入力します。
ここで、そのAの真ん中ぐらいの所にスペースをいれると、カーニングが効いて、見た目で改行してしまいます。

あるいは

AAAAAAAAAAAAA(A)AAAAAAAAAAAAAAAAAAAAA.....

としたいときも、見た目が、

AAAAAAAAAAAAA(A)
AAAAAAAAAAAAAAAAAAAAA.....


のようになってしまいます。

ずばり、カーニングさせないで、単語の途中でもブチッと改行するようにすることは、可能でしょうか?

編集    削除
メラトニン  2005-04-09 07:14:44  No: 14171  IP: [192.*.*.*]

http://www.microsoft.com/japan/developer/library/vcmfc/_mfc_edit_styles.htm
を見た限りではできなそうです。

編集    削除
賭博アルプス王ハイジ  2005-04-09 10:47:44  No: 14172  IP: [192.*.*.*]

たしかに、これでは可能性すら感じませんね。
こんな、簡単で基本的なことなのに

word単位重視の英語圏生まれのソフトだから仕方ないかも
いっそのこと、半角入力を全部自動で全角に変換させて、カーニングしないようにするかな・・・

編集    削除
ano  2005-04-09 10:54:29  No: 14173  IP: [192.*.*.*]

カーニングの意味が間違ってるような・・・

編集    削除
賭博アルプス王ハイジ  2005-04-10 02:07:57  No: 14174  IP: [192.*.*.*]

正確にはそうかもしれませんね。
ま、その機能により引き起こされるということで・・・

編集    削除
uun  2005-04-10 09:13:59  No: 14175  IP: [192.*.*.*]

カーニングによって引き起こされるのではなくて,WordWrapによってそうなるのですよ。(カーニングとは関係ありません)

編集    削除
賭博アルプス王ハイジ  2005-04-10 11:11:32  No: 14176  IP: [192.*.*.*]

すこし、方法を考えてみました。

最初の例で、スペースや'('や')'は、アルファベットと異なり、トークンを分離する  Wordの区切り文字  となっています。コレを無効にするということでは、可能でしょうか?

つまり、
AAAAAAAAAAAAAAAA(AAAA)AAAAAA AAAA A AAAA......
なんてのを、すべてアルファベットと同様の一つのWordと思わせてしまうのです。


APIでdeliminatorを変更できるとか・・・

編集    削除
自前で  2005-04-10 16:27:44  No: 14177  IP: [192.*.*.*]

WordWrapをFalseにして、自前で改行位置を調節するしかないのでは?

編集    削除
賭博アルプス王ハイジ  2005-04-10 22:11:41  No: 14178  IP: [192.*.*.*]

ヒントになりそうなところを見つけました。

http://www.fides.dti.ne.jp/~tokai/vc/vcchips2.html
http://www.delphi32.com/info_facts/faq/faq_478.asp

これでいいのか、試してみます。

編集    削除
賭博アルプス王ハイジ  2005-04-10 22:27:20  No: 14179  IP: [192.*.*.*]

うまくいきました!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を変更するという方法を思いつきました。みなさんありがとうございました。

解決とさせていただきます。

編集    削除
メラトニン  2005-04-11 07:39:54  No: 14180  IP: [192.*.*.*]

誤爆スミマセン。
http://www.delphi32.com/info_facts/faq/faq_478.asp
確かに上記の方法での動作確認しました。
報告ありがとうございました。

編集    削除
賭博アルプス王ハイジ  2005-04-14 04:38:09  No: 14181  IP: [192.*.*.*]

とんでもありません。メラトニンさんの発言に助けられたので、またよろしくおねがいします。


ところで、その後一つわかったことがあったので、のせておきます。私と同じ問題でここを見た人が、参考になることがあれば幸いです。


どの文字を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("[]();:,.\"'") ;
のとこをいじってくださいな。

編集    削除