CreateFontIndirectでのLOGFONTの設定方法 – プログラミング – Home

通知
すべてクリア

[解決済] CreateFontIndirectでのLOGFONTの設定方法


DAT
 DAT
(@DAT)
ゲスト
結合: 15年前
投稿: 10
Topic starter  

開発環境は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
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

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


返信引用
DAT
 DAT
(@DAT)
ゲスト
結合: 15年前
投稿: 10
Topic starter  

返信ありがとうございます。

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 明朝で表示されてしまいます。


返信引用
しま
 しま
(@しま)
ゲスト
結合: 18年前
投稿: 123
 

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

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

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


返信引用
DAT
 DAT
(@DAT)
ゲスト
結合: 15年前
投稿: 10
Topic starter  

フォントの性質を知るにはいったいどうすればいいのでしょう?

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


返信引用
DAT
 DAT
(@DAT)
ゲスト
結合: 15年前
投稿: 10
Topic starter  

ひとまず、解決と致します。
ご協力ありがとう御座いました。


返信引用
しま
 しま
(@しま)
ゲスト
結合: 18年前
投稿: 123
 

一時間程しか待てないんですね。返事がすぐ返ってくるとお思いのようですが
会話ではないので二日ぐらい返事がつかないことは当たり前だと私思うのですが、
残念ですね

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

既に手遅れになってますが(笑)、うまくいかないのは
「キャラクタセット」に「ANSIセット」を指定しているからではないでしょうか。
SHIFTJIS_CHARSETかDEFAULT_CHARSETを指定すべきです。

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

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


返信引用
DAT
 DAT
(@DAT)
ゲスト
結合: 15年前
投稿: 10
Topic starter  

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

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


返信引用
しま
 しま
(@しま)
ゲスト
結合: 18年前
投稿: 123
 

>関数についての情報ありがとうございます。

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


返信引用
DAT
 DAT
(@DAT)
ゲスト
結合: 15年前
投稿: 10
Topic starter  

返信が遅くなりましたが、上手く行っていました。ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました