CreateFontIndirectでのLOGFONTの設定方法

[戻る]
DAT 2009/08/21(金) 00:49:37
開発環境はVC.NET 2008 / MFCです。

ダイアログ上のリストボックスに対して、フォントの変更を行うために、
CreateFontIndirectでフォントを設定しSetFontを行っています。
しかし、LOGFONT構造体の設定方法が今ひとつ良く判っていません。

lfHeight         0xfffffff4
lfWidth          0x00000000
lfEscapement     0x00000000
lfOrientation    0x00000000
lfWeight         0x00000190
lfItalic         0x00
lfUnderline      0x00
lfStrikeOut      0x00
lfCharSet        0x00
lfOutPrecision   0x03
lfClipPrecision  0x02
lfQuality        0x01
lfPitchAndFamily 0x11
lfFaceName       "MS 明朝"

上記の設定でMS 明朝で表示することに成功しましたが、他のフォントに変更
しようとしてlfFaceNameの部分を変えても、MS ゴシックになったり、MS UI
Gothicになってしまいます。
恐らく、lfFaceNameを変えただけでは希望するフォントにはならないと思うので
すが、実際にはどのように値を設定していけばいいのか、見当がついていない状
態です。

適切な値の設定方法をどなたかご教示願えませんでしょうか。

ryo 2009/08/21(金) 01:11:38
1.希望のフォントはちゃんとOSに入ってますか?
2.成功例だけではなく、失敗例のソースのほうがむしろ重要
3.LOGFONT構造体の設定内容だけじゃなく
フォントを設定するためにつくった関数全体もあったほうがいい
構造体の中身ではないところに問題がある可能性もあります

DAT 2009/08/21(金) 01:49:50
返信ありがとうございます。

1:入ってます
2:lfFaceNameに与える文字列が違うだけで、それ以外はソースは同一です
3:OnInitDialog関数の中で下記のような記述をしています。
    m_fontはダイアログのメンバ変数(CFont)です。

    CListBox* lbFile = static_cast< CListBox* >( GetDlgItem( IDC_LIST1 ) );
    LOGFONT lf;
    CDC* pDC = lbFile->GetDC();
    lf.lfHeight = -::MulDiv( 9, pDC->GetDeviceCaps( LOGPIXELSY ), 72);
    lf.lfWidth = 0;
    lf.lfEscapement = 0;
    lf.lfOrientation = 0;
    lf.lfWeight = 400;
    lf.lfItalic = 0;
    lf.lfUnderline = 0;
    lf.lfStrikeOut = 0;
    lf.lfCharSet = 0;
    lf.lfOutPrecision = 3;
    lf.lfClipPrecision = 2;
    lf.lfQuality = 1;
    lf.lfPitchAndFamily = 0x11;
    _tcscpy_s( lf.lfFaceName, LF_FACESIZE, _T("NFモトヤバーチ1等幅") );
    if ( m_font.GetSafeHandle() ) {
        m_font.DeleteObject();
    }
    BOOL sc = m_font.CreateFontIndirect( &lf );
    if ( sc ) {
        lbFile->SetFont( &m_font );
    }

これを実行すると、リストボックスのフォントはMS 明朝で表示されてしまいます。

しま 2009/08/21(金) 07:14:36
CreateFont() CreateFontIndirect() は論理フォントを指定するものです。
これは指定したフォントに近いものを選ぶということです。そのために、
フォント名以外にフォントの性質を指定させています。

つまり、指定したフォント名のフォントがなくても、指定した性質から指定フォント
に近いと判断したフォントを選んで、描画に用います

lfCharset, lfPitchAndFamily があなたの指定したいフォントと違えば
指定したフォント名以外のフォントを選ぶことは避けられません
フォント名はフォントの性質(セリフの有無、固定ピッチかどうかなど)を
判定するためには役に立ちませんので名前だけではフォントは選べません

DAT 2009/08/21(金) 09:43:16
フォントの性質を知るにはいったいどうすればいいのでしょう?

ひとまず、CreatePointFontを使うことで問題は避けることは出来ましたが、
出来ることならばLOGFONTを利用したいと考えています。

DAT 2009/08/21(金) 10:30:57
[[解決]]
ひとまず、解決と致します。
ご協力ありがとう御座いました。

しま 2009/08/21(金) 11:24:54
一時間程しか待てないんですね。返事がすぐ返ってくるとお思いのようですが
会話ではないので二日ぐらい返事がつかないことは当たり前だと私思うのですが、
残念ですね

msdn ライブラリーを調べれば分かる事なんですが EnumFontFamiliesEx() を使って
調べることができます

仲澤@失業者 2009/08/21(金) 13:35:04
既に手遅れになってますが(笑)、うまくいかないのは
「キャラクタセット」に「ANSIセット」を指定しているからではないでしょうか。
SHIFTJIS_CHARSETかDEFAULT_CHARSETを指定すべきです。

あと、OUT_STROKE_PRECISを指定してますが、普通は
TrueTypeを指定しますよね。

っつうか、なぜに数値で指定するのでしょう。
定義済みの値を使えばすぐに気づきそうなものなんですがねぇ・・・(vv;)。

DAT 2009/08/21(金) 21:16:49
>しまさん
たんに1時間たってから解決をチェックしてなかったことに気付いたので
解決にチェックを入れるために書き込んだだけです。申し訳御座いません。
関数についての情報ありがとうございます。

>仲澤@失業者さん
すでに数値で決定していたものでしたので、定数名を使っていません。

しま 2009/08/23(日) 16:40:51
>関数についての情報ありがとうございます。

EnumFontFamiliesEx() を使ってみたら上手くいったかどうか
書き込んで下さると嬉しいです

DAT 2009/09/08(火) 21:06:56
返信が遅くなりましたが、上手く行っていました。ありがとうございました。

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