領域に収めるためのフォントサイズの計算


ひる  2012-05-25 10:02:35  No: 73401  IP: 192.*.*.*

領域内にユーザが指定した複数行のテキストを描画する箇所があるのですが、
テキストが長すぎて領域内に収まらない場合、
自動でフォントを縮小してあげる処理を実装しようとしています。
テキストの描画にはDrawText()を使っています。

最初は、当初のフォントを使ってDT_CALCRECTでサイズを計算し、
収めたい領域サイズとの比率を求めて、1未満だったら、
その比率を使って縮小したサイズのフォントを作成し直せば、
綺麗にフィットできるだろうと考えました。

ところが、DT_WORDBREAKやDT_EDITCONTROLを付けて自動折り返しも付けると、
フォントサイズの縮小によって折り返し位置が変わり、
その結果、Y方向に空き領域ができてしまいます。

このような場合、うまく一発で求められる計算方法というのはあるものでしょうか?
それとも、拡大縮小を繰り返してちょっとずつ近づけていくしかないものでしょうか?

編集 削除
gak  2012-05-28 23:02:38  No: 73402  IP: 192.*.*.*

> このような場合、うまく一発で求められる計算方法というのはあるものでしょうか?
GDIでは難しいと思われる。俺的理由は↓
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+201107/11070010.txt

> それとも、拡大縮小を繰り返してちょっとずつ近づけていくしかないものでしょうか?
DirectWrite を使えるならこの問題に悩む事は無い。
ID2D1RenderTarget::SetTransform() で好きに表示スケールを変えてやっても GDI の様に
文字表示位置がズレる事は無く同じ位置関係で描画される。
ただ動作環境としてVista以降が必要となってしまうが…

編集 削除
ひる  2012-06-01 09:44:23  No: 73403  IP: 192.*.*.*

> GDIでは難しいと思われる

DT_WORDBREAKなどを使う際には、
描いてみないとサイズは決まらないということになるのですか。
DrawText()自体、昔からある古いAPIであることは理解していますが、
Textout()やDrawText()に代わる便利なものがないですね。

> ただ動作環境としてVista以降が必要となってしまうが…

DirectWriteの技術は勉強してみたいところですが、
Vista以降というのは現状ではちょっと大きな壁になってしまいます。

編集 削除