• ベストアンサー

リストボックスのフォントをサイズを変更したい

コンパイルはできるのですが、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;

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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フォントですからさほど自由度が無いように思います

_jast
質問者

お礼

ありがとうございます。 流れは理解できましたが、CreateInDirectでエラーが出てしまいまい、 このメンバが無かったのでCreateFontIndirectWに書き換えましたが実行後エラーが出ました。が、思いっきり削って CFont* font = new CFont; font->CreatePointFont(80, _T("MS 明朝")); m_ListBox.SetFont(font); これでサイズとフォント体を変更できるようになりました。 納得いかないので、もうすこしLOGFONT取り込み>編集>Setを頑張ってみます。 目的は達成しました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.3

手前で使用しているリストボックスのフォント変更メソッドです。 これを参考にしてみてください。   /**    * リストボックスのフォントを変更。    * @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);   }

_jast
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

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

_jast
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

 こんにちは。  新しいフォントクラスを作成してエディットボックスクラスにセットしないとけないのでは? 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);

_jast
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VC2008にてフォントの変更がうまくいきません

    環境  WindowsXP  VC 2008 MFC   内容  上記の環境化で、ウインドウズアプリケーションを作成しており  以下のようなプログラムをOnInitDialogでCallすると  アサートが発生してしまいます  問題なのは、Unicodeでコンパイルして実行するとうまくいかず  マルチバイトでコンパイルするとうまく行きます。  ご教授願います。 エディットコントロールの派生クラスにて 以下の内容を実行しています LOGFONT m_logfont; ←コンストラクタでコントロールから取得済み CFont m_font;←コンストラクタで設定済み BOOL エディットコントロールの派生クラス::SetTextFont( int width, int height) {    ::_tcscpy_s(m_logfont.lfFaceName,sizeof(m_logfont.lfFaceName),_T("MS ゴシック"));   m_logfont.lfHeight = height; m_logfont.lfWidth = width; // m_font.DeleteObject(); // 現在のフォントの削除 // フォントを作成 m_font.DeleteObject(); if( m_font.CreateFontIndirect(&m_logfont) ){ SetFont(&m_font); } // ウィンドウを再描画 return RedrawWindow(); }

  • コントロールのフォントの変更

    コントロールに任意のフォントを指定できなくて困っています。 class CFrame : public CFrame { private: CFont m_cFont; CStatic m_cStatic; public: CFrame(); afx_msg void OnCreate(LPCREATESTRUCT); }; CFrame::CFrame() { Create( // 省略 ); m_cFont.CreateFont( // 省略 ); } axf_msg void CFrame::OnCreate(LPCREATESTRUCT lp) { RECT rect; DWORD dw; rect.top = 10; rect.left = 10; rect.right = 100; rect.bottom = 60; dw = WS_CHILD | WS_VISIBLE; m_cStatic.Create("AAAAAA", dw, rect, this, ID); m_cStatic.SetFont(&m_cFont, TRUE); } 文字は表示されるのですが、フォントがおそらくデフォルトのままだと思われるのですが、どうしてかわかりません。 ダイアログベースでは、OnInitDialogで実行していたと思いますが、以上のコードではだめなんでしょうか? よろしくお願いします。

  • MFCのリストボックスについて

    MFCをVC6.0で作成しています。現在、ダイアログボックスを作成しているのですが、ダイアログボックスの中のリストボックスについて、教えてください。 void CFileReadeDlg::GetIndex() { UpdateData(TRUE); m_nCount = m_xcList.GetCurSel(); if(m_nCount==LB_ERR) { AfxMessageBox("選択してください"); } } の関数で、リストボックス内に存在するカーソルの位置を割り出したいのですが、 この関数は、 void CFileReadeDlg::OnSelchangeDatatable() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください GetIndex(); } のようにリストボックスの中のセルを変更した際に稼動する関数内で呼び出しています。 ですが、実際、このm_nCountには、0しか入りません。 これは、単にOnSelchangeDatatable()の関数を何処かの関数内にも呼び出していないからでしょうか。 そもそも、呼び出す必要はないかと思っていたのですが。 又、VCのヘルプに『単一選択リスト ボックスで、現在選択されている項目があれば、その項目の 0 から始まるインデックスを取得します』 とありましたが、0から始まるインデックスとは、どういうことを意味しているのでしょうか。 よろしくお願いします。

  • コンボボックスのドロップダウンリストが表示されない

    MFCでアプリを作成、アプリの画面上にコンボボックスのリソースを貼り付け、アプリ起動直後は、コンボボックスのドロップダウンリストを表示できています。 しかし、アプリ画面のサイズを変更すると、▼ボタンを押下しても、ドロップダウンリストが表示されなくなってしまいます。 アプリ画面のサイズを変更後も、コンボボックスのドロップダウンリストを表示できるようにする方法を教えてください。

  • コンボボックス内の文字サイズ変更

    エクセルでコンボボックスとリストボックスを作り ボックス内に文字を入れたのですが ボックス内の文字サイズが小さいので大きくしたいのですが 何処で変更すれば宜しいのでしょうか? ボックス自体の大きさは引っ張れば幾らでも変更できるのですが 文字サイズは何処にも見当たりません。 ご存知の方いらっしゃいましたら宜しくお願い申し上げます。

  • チェックボックスのサイズ変更

    Excel2000で、フォームのチェックボックスを使いたいのですが、これはサイズを変更することができないのでしょうか? プロパティでサイズ変更をしてもボックスとテキストの大きさは変わらず、不便な思いをしています。 もし方法があるのなら、ぜひ教えてください。 よろしくお願いします。

  • コンボボックスかリストボックスの使い方

    VB2008でプログラミングしています。 コードと値がセットになっているDBからデータを取得して フォームに表示させるように作成しています。 フォームに表示するのは値で、実行ボタンを押したときには コードを取得したいのですが この場合は、コンボボックスでしょうか?リストボックスでしょうか? 複数選択はできません。 選ばれたコードを元にDBを検索するプログラムが実行されます。

  • コンボボックスのリストに水平スクロールバーを表示したい

    WinXP,SDKで開発しています。 今、最大サイズ画面の右側にあるコンボボックスのリスト部分が表示仕切れなくて困っています。 実際のコンボボックスは小さく、リスト表示の時に大きくしています。 SendDlgItemMessage(hwnd, IDC_COMBO1, CB_SETDROPPEDWIDTH, 240, 0L); このサイズで丁度リストの中身が見えるのですが、リストが画面からはみ出しています。 そこで、リストのサイズを200くらいにして(200で画面に収まります)水平スクロールを表示したいのですがうまく行きません。 ShowScrollBar() で表示出来るかと思ったのですが、渡すウィンドウハンドルが分からないのです。 おそらくリストのウィンドウハンドルだと思うのですが… このリストのウィンドウハンドルを取得する方法がよく分からないのです。 GetComboBoxInfo() という関数があるようなのですが、コンパイルエラーになってしまって先にすすみません。(定義されていない識別子) そもそも考え方を間違えているのでしょうか。 もっと簡単な方法がありますか? アドバイスをお願い致します。

  • マウス座標からリストボックスのリストインデックスを知る方法

    リストボックスをドラッグアンドドロップのドロップ先とするプログラムを作成しているのですが、どのリストボックス項目にドロップされたかを知る方法を教えてください。 ドロップ時にはマウス座標が渡されるのですが、この座標からリストインデックスをどのようにして求めたらよいか分からずにいます。 対象としているプログラムは、フォントサイズもリストボックスのサイズも固定ですので、以下のようなコーディングでしのげていますが、フォントサイズやリストボックスサイズが実行時に変えられても対応できるような、もっとスマートな方法はないでしょうか? リストインデックス = リストボックス.TopIndex + マウスY座標 \ リストボックスの項目の高さ(9ptフォントで180ぐらい?)

  • CListCtrlのcheckboxサイズ変更

    WindowsCE、MFC、C++で実装しています。 CListCtrlで表を作成し、 下記の方法でチェックボックスを表示させました。 CListCtrl m_list; m_list.SetExtendedStyle((m_lstCheck.GetExtendedStyle()|LVS_EX_CHECKBOXES)); チェックボックス(画像参照)のサイズを大きくしたいのですが、 方法がわかりません。 (SetFont()関数で試してみましたが、文字にしか反映されませんでした。)