• ベストアンサー

GetTextExtentPoint32での高さ

こんにちは。 数字が入った文字列をGetTextExtentPoint32関数で幅と高さを取得しようとすると、幅は正しく取得できるのですが、高さが倍近い値で返ってきてしまいます。どうやら高さはフォント全体の高さで取得しているようです。"0123"と"0123j"をセットしても同じ高さが返ってきます。 これを実際の描画範囲で取得するにはどうすればよろしいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

幅については描画する範囲がプロポーショナルピッチによる幅の変動する為、取得する必要がありますが、 高さについては文字(といか行)毎に上下することはない(上下するようでは見にくい)ということから、指定したフォントで設定されている値がそのまま返却されるのでしょう。 それでも「描画される最小矩形」が必要なのでしょうか? 画面更新時はなるべく最小矩形の方が処理量は減るかと思われますが、現在のPCならドライバ任せでも問題になるような差は出ないと思われますが……。 それでも取得したい。 ということであれば文字列を分解してGetGlyphOutline()で取得することで1文字のフォントでの矩形サイズが取得できるでしょう。 ただし、文字描画の際にはベースラインなどを考慮しますので、ベースラインをそろえた上で算出する必要がありますが…… http://marupeke296.com/WINT_GetGlyphOutline.html 辺りが図になっているのでわかりやすい…でしょうかね。 各文字のグリフを取得した後、「ベースラインより上」と「ベースラインより下」のサイズをそれぞれ算出し、必要な文字フォント分の処理を終えた後で加算すればよいでしょう。 # uCharの設定がいろいろと手間…でしょうかね。(UNICODEならそれほどでもないかも知れませんが…SJISだと面倒) # uFormatも…かな。アンチエイリアス有りと無しでは取得できるサイズが変わるでしょうし。 # cbBufferは0、lpvBufferはNULLでもかまわない…かも知れません。 使用する文字によっては… (gmBlackBoxY - gmGlyphOrign.y)がマイナスになってしまう場合もあるのでご注意を。 # "-"等、ベースラインより上だけで済んでしまうものの場合とか。

TeijigoTeatime
質問者

お礼

詳細なご返答ありがとうございます。 いろいろ考慮しなくてはならないことが多いですね。 片手間ではできそうもありません。 今はGetTextExtentPoint32を利用して、余裕ができたらWr5さんの提示していただいた方法を確認してみます。 ありがとうございました。

関連するQ&A