CreateFont()のフォント名のデフォルト動作


ととろ  2006-06-17 01:29:23  No: 62212

CreateFont()の最後に引数に指定するフォント名(タイプフェイス)に、存在しないフォント名を指定した場合、エラーとならず正常復帰しました。
このとき、どの設定のフォントが有効となっているのでしょうか?
#自分の見た限りMS明朝となっているようです。

すみませんがご教授お願いいたします。


Blue  2006-06-17 01:41:24  No: 62213

一応MSDNには
<MSDN>
lpszFace 
  フォントの名前が入った NULL で終わる文字列へのポインタを指定します。
  文字列の長さは、終端の NULL 文字も含めて 32 文字以下にしなければなりません。
  EnumFontFamilies 関数を使うと、現在利用可能なフォントの名前を列挙できます。 
  NULL ポインタや空の文字列へのポインタを指定すると、ほかのパラメータで指定した
  条件に合うフォントの中から最初に見つかったフォントが選択されます。 
</MSDN>
とあるだけなので、フォントが無い場合や32文字以上のフォントを設定したときの話は無いですね。
エラーにならないということは、最後の
> ほかのパラメータで指定した条件に合うフォントの中から最初に見つかったフォント
が適応されるんだろうか。


YuO  2006-06-17 21:12:59  No: 62214

> CreateFont()の最後に引数に指定するフォント名(タイプフェイス)に、存在しないフォント名を指定した場合、エラーとならず正常復帰しました。
> このとき、どの設定のフォントが有効となっているのでしょうか?

CreateFont自体は論理フォントを決定するだけです。
実際のフォントは,SelectObjectで決定されます。
http://msdn.microsoft.com/library/en-us/gdi/fontext_35ta.asp

で,フォントのマッピングですが,Windows 3.1時代の
http://msdn.microsoft.com/library/en-us/dngdi/html/msdn_fontmap.asp
が有効なようです。
# 実はフォント名は最高の重み付けを持っていません。

そして,問題の実際に描画されるフォント(物理なフォント)ですが,名前だけであればGetTextFace API
http://msdn.microsoft.com/library/ja/jpgdi/html/_win32_gettextface.asp
http://msdn.microsoft.com/library/en-us/gdi/fontext_3jtx.asp
が使えます。また,
http://support.microsoft.com/kb/230342/
も参考資料として役に立つかもしれません。


ととろ  2006-06-18 00:31:14  No: 62215

回答ありがとうございます。

教えていただいた情報から、存在しないフォントを指定した場合は、
「ほかのパラメータで指定した条件に合うフォントの中から最初に見つかったフォントが選択される」
ということみたいですね。
#誤りがあればご指摘ください。


YuO  2006-06-18 06:34:08  No: 62216

> 教えていただいた情報から、存在しないフォントを指定した場合は、
> 「ほかのパラメータで指定した条件に合うフォントの中から最初に見つかったフォントが選択される」
> ということみたいですね。

違います。
完全に一致するものがある場合を除き,ペナルティの一番小さいフォントが選ばれます。
# 完全に一致する場合はそもそもペナルティが小さいでしょうが。

例えば,MS 明朝を指定しても,SYMBOL_CHARSETを指定していた場合,
lfCharSetのペナルティは最大なので,MS 明朝は選ばれません。
# lfCharSetのペナルティ値は65000。事実上このペナルティをひっくり返すことは不可能。


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

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






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