開発環境は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を変えただけでは希望するフォントにはならないと思うので
すが、実際にはどのように値を設定していけばいいのか、見当がついていない状
態です。
適切な値の設定方法をどなたかご教示願えませんでしょうか。
1.希望のフォントはちゃんとOSに入ってますか?
2.成功例だけではなく、失敗例のソースのほうがむしろ重要
3.LOGFONT構造体の設定内容だけじゃなく
フォントを設定するためにつくった関数全体もあったほうがいい
構造体の中身ではないところに問題がある可能性もあります
返信ありがとうございます。
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 明朝で表示されてしまいます。
CreateFont() CreateFontIndirect() は論理フォントを指定するものです。
これは指定したフォントに近いものを選ぶということです。そのために、
フォント名以外にフォントの性質を指定させています。
つまり、指定したフォント名のフォントがなくても、指定した性質から指定フォント
に近いと判断したフォントを選んで、描画に用います
lfCharset, lfPitchAndFamily があなたの指定したいフォントと違えば
指定したフォント名以外のフォントを選ぶことは避けられません
フォント名はフォントの性質(セリフの有無、固定ピッチかどうかなど)を
判定するためには役に立ちませんので名前だけではフォントは選べません
フォントの性質を知るにはいったいどうすればいいのでしょう?
ひとまず、CreatePointFontを使うことで問題は避けることは出来ましたが、
出来ることならばLOGFONTを利用したいと考えています。
ひとまず、解決と致します。
ご協力ありがとう御座いました。
一時間程しか待てないんですね。返事がすぐ返ってくるとお思いのようですが
会話ではないので二日ぐらい返事がつかないことは当たり前だと私思うのですが、
残念ですね
msdn ライブラリーを調べれば分かる事なんですが EnumFontFamiliesEx() を使って
調べることができます
既に手遅れになってますが(笑)、うまくいかないのは
「キャラクタセット」に「ANSIセット」を指定しているからではないでしょうか。
SHIFTJIS_CHARSETかDEFAULT_CHARSETを指定すべきです。
あと、OUT_STROKE_PRECISを指定してますが、普通は
TrueTypeを指定しますよね。
っつうか、なぜに数値で指定するのでしょう。
定義済みの値を使えばすぐに気づきそうなものなんですがねぇ・・・(vv;)。
>しまさん
たんに1時間たってから解決をチェックしてなかったことに気付いたので
解決にチェックを入れるために書き込んだだけです。申し訳御座いません。
関数についての情報ありがとうございます。
>仲澤@失業者さん
すでに数値で決定していたものでしたので、定数名を使っていません。
>関数についての情報ありがとうございます。
EnumFontFamiliesEx() を使ってみたら上手くいったかどうか
書き込んで下さると嬉しいです
返信が遅くなりましたが、上手く行っていました。ありがとうございました。