プロポーショナルなフォントについて

[戻る]
あお 2005/02/16(水) 16:41:25
いつもお世話になっております。

質問させていただきます。
プロポーショナルなフォントである指定の幅の中に
文字列を入れたいと思っています。
固定長のフォントなら指定幅/文字数を文字の幅に
指定すれば思う結果を得る事ができました。
この処理をプロポーショナルなフォントで実行する事は
可能なのでしょうか?

やり方がわかる方がいらっしゃいましたらご教授お願いいたします。

Windows2000 VS6SP5 VC++ MFCではありません。
固定幅のフォントなら以下のプログラムで実行できました

LOGFONT lf;
HFONT hFont, oldFont;
char buffer[MAXTEXT];// 描画する文字列

lf.lfHeight = (height); // heightは文字の高さ
// widthは指定された文字列の幅
lf.lfWidth = (width/strlen(buffer)); // 文字の幅を指定
lf.lfEscapement = 0;
lf.lfWeight = 0;
lf.lfItalic = 0;
lf.lfUnderline = 0;
lf.lfStrikeOut = 0;
lf.lfCharSet = SHIFTJIS_CHARSET;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
lf.lfClipPrecision = CLIP_LH_ANGLES ;
lf.lfQuality = DEFAULT_QUALITY;
lf.lfPitchAndFamily = FF_DONTCARE;
strcpy(lf.lfFaceName, "HGPゴシックE"); // プロポーショナルなフォント
hFont = CreateFontIndirect(&lf);
oldFont = (HFONT)SelectObject(hDC, hFont);
SetTextColor(hDC, RGB(0, 0, 0));
SetTextAlign(hDC, TA_LEFT | TA_BOTTOM);
SetBkMode(hDC, TRANSPARENT);
TextOut(hDC, x, y, buffer, strlen(buffer));//x,yは任意の位置
SelectObject(hDC, oldFont);
DeleteObject(hFont);

よろしくお願いいたします

たく [E-Mail] 2005/02/16(水) 17:44:22
GetTextExtentPoint32で文字幅(高さも)取得できます。
描画領域に収まるサイズにまで文字数をつめていけば
よいかと思います。

PATIO 2005/02/18(金) 10:37:38
フォント側のサイズを調整して詰め込みたいのであれば、
既に紹介されているGetTextExtentPoint32を使ってTry and Errで頑張るしかないかと思
います。
実際にはフォント作成はコストが高いので2,3種類の大きさでフォントを作成しておいて
その中で収まるサイズになるフォントを選択すると言うのが現実的だと思います。
実際、私はその方法でボタン内にテキストを収めると言う処理をやっていましたし。

固定ピッチのフォントのように計算で一発と言うのは無理だと考えた方がいいと思います。

あお 2005/02/18(金) 13:18:52
[[解決]]
返信遅くなって申し訳ありません。
たくさん・PATIOさん返信ありがとうございます。

フォント側のサイズを調整したいと思っていましたので、
(言葉足らずで申し訳ありませんでした)
GetTextExtentPoint32を使用して1文字毎にサイズを取り出し、
そのサイズを調整する事で実行する事にしました。

一応、上記の方法で実行する事ができました。

ご教授ありがとうございました。

PATIO 2005/02/18(金) 16:22:52
既に解決になっていますが、

その幅に押し込めたい文字列をGetTextExtentPoint32にかけてみれば、
良いだけのような気がします。
大きすぎる時は、一段小さいフォントをDCにSelectObjectしてから
再び、その幅に押し込めたい文字列をGetTextExtentPoint32にかければ良いだけです。
その幅に押し込められない時は内部的に改行するとかするのであれば、
文字ごとに処理する必要があると思いますが、
とにかく一定の文字列を押し込めたいだけならわざわざ一文字ずつ処理する必要は
無いような気がします。

古いスレッドには追加発言できません。