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

解決


賭博アルプス王ハイジ  2005-04-09 05:04:37  No: 14170

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

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

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

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

あるいは

AAAAAAAAAAAAA(A)AAAAAAAAAAAAAAAAAAAAA.....

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

AAAAAAAAAAAAA(A)
AAAAAAAAAAAAAAAAAAAAA.....

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

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


メラトニン  2005-04-09 07:14:44  No: 14171

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


賭博アルプス王ハイジ  2005-04-09 10:47:44  No: 14172

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

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


ano  2005-04-09 10:54:29  No: 14173

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


賭博アルプス王ハイジ  2005-04-10 02:07:57  No: 14174

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


uun  2005-04-10 09:13:59  No: 14175

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


賭博アルプス王ハイジ  2005-04-10 11:11:32  No: 14176

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

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

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

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


自前で  2005-04-10 16:27:44  No: 14177

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


賭博アルプス王ハイジ  2005-04-10 22:11:41  No: 14178

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

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

うまくいきました!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

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


賭博アルプス王ハイジ  2005-04-14 04:38:09  No: 14181

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加