プロが教える店舗&オフィスのセキュリティ対策術

コンパイルはできるのですが、GetFontでCFontが取得できません。
これを最も早い段階で実行するには、どこに書けばいいんでしょうか?
OnCreateで、リストボックスのCreate後すぐに書きました。
また、もっと簡単にサイズだけ変更する方法はありませんか?
なぜ、GetFontが失敗するのか教えてください。お願いします。
MFCです。

LOGFONT logFont;
CFont* pFont;
pFont = m_OutputListBoxBuf.GetFont();
pFont->GetLogFont(&logFont);
logFont.lfHeight = logFont.lfHeight * 0.4;
logFont.lfWidth = logFont.lfWidth * 0.4;

A 回答 (4件)

OnCreate内でなら GetDCでCDCを取得


ダミーのフォントを選択して現在のフォントを取得
このフォントから LOGFONTを取得
といった手順ではいかがでしょう

CFont DummyFont;
DummyFont.CreatePointFont(120, "MS 明朝");
CDC* pDC = GetDC();
CFont* pDCFont = pDC->SelectObject( &DummyFont );
pDC->SelctObject( pDCFont );
ReleaseDC( pDC );
pDCFont->GetLogFont( &logFont );

logFont.lfHeight = logFont.lfHeight * 0.4;
logFont.lfWidth = logFont.lfWidth * 0.4;
m_Font.CreateInDirect( &logFont );
m_ctlList.SetFont( &m_Font );
といった具合で

でもこの方法だと Systemフォントですからさほど自由度が無いように思います
    • good
    • 0
この回答へのお礼

ありがとうございます。
流れは理解できましたが、CreateInDirectでエラーが出てしまいまい、
このメンバが無かったのでCreateFontIndirectWに書き換えましたが実行後エラーが出ました。が、思いっきり削って

CFont* font = new CFont;
font->CreatePointFont(80, _T("MS 明朝"));
m_ListBox.SetFont(font);

これでサイズとフォント体を変更できるようになりました。
納得いかないので、もうすこしLOGFONT取り込み>編集>Setを頑張ってみます。
目的は達成しました。ありがとうございました。

お礼日時:2008/11/15 17:52

手前で使用しているリストボックスのフォント変更メソッドです。


これを参考にしてみてください。
  /**
   * リストボックスのフォントを変更。
   * @param[in] hWnd リストボックスを示すウィンドウハンドル
   * @param[in] hFont リストボックスに適用する新しいフォント
   */
  virtual void setFont(HWND hWnd, HFONT hFont)
  {
    if ((!hWnd) || (!hFont))
    {
      return;
    }
    WPARAM wParam = (WPARAM)hFont;
    BOOL fRedraw = TRUE;
    LPARAM lParam = MAKELPARAM(fRedraw, 0);
    UINT uMsg = WM_SETFONT;
    ::PostMessage(hWnd, uMsg, wParam, lParam);
  }
    • good
    • 0
この回答へのお礼

SetFontをメッセージ処理で実現する方法参考になりました。
必ず必要になると思うのでうれしいです。ありがとうございました。

お礼日時:2008/11/15 17:55

GetFont自体はコントロールに対してFont設定を行っていない場合NULLが返ってきます



Dialog上のコントロールならばベースのダイアログにFontが設定されているのでGetFontは成功します
CViewなどの上のコントロールの場合Font設定はされていませんのでプログラム側で設定しないといけません

この回答への補足

ダイアログではありません。
Createでウィンドウに張り付けたコントロールのデフォルトの設定フォントを取り出して書き換えるにはどうすればいいのでしょうか?

補足日時:2008/11/15 13:27
    • good
    • 0

 こんにちは。


 新しいフォントクラスを作成してエディットボックスクラスにセットしないとけないのでは?

LOGFONT logFont;
CFont* pFont, *pNewFont;
pFont = m_OutputListBoxBuf.GetFont();
pFont->GetLogFont(&logFont);
logFont.lfHeight = logFont.lfHeight * 0.4;
logFont.lfWidth = logFont.lfWidth * 0.4;

//新しいフォントクラスを作成する
pNewFont = new CFont();
pNewFont->CreateFontIndirect(&logFont);
m_OutputListBoxBuf.SetFont(pNewFont);

この回答への補足

GetFontはすでにコントロールに設定されているデフォルトのフォントを読み込んでくれるのではないんでしょうか?
この設定を読み込んでlfHeightとlfWidthの値だけを書き換えて
コントロールに戻したいのですが、このやり方で新しく作ったフォントにGetFontを試しましたが、
同じくGetFontの戻り値事態がなくエラーが出てしまいます。
デフォルトのフォントを読み込む方法を教えてください。

補足日時:2008/11/15 11:10
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!