none
ダイアログバーに配したエディットコントロールのフォントについて RRS feed

  • 質問

  • いつもお世話になります。

    MFCプログラムのダイアログバー上にあるエディットコントロールのフォントサイズを変更するにはどうすれば良いのでしょうか?

    よろしくお願い致します。

    2013年8月6日 3:37

回答

  • まず、
    ご提示のコードがどこにコードされたのかわかりませんので、なんとも回答しかねます。
    というのは、これではオブジェクトの寿命がまったくわからないからですね。

    たとえば、以下のコードには効果がありません。

    void SetFont_to_Wnd(
      CWnd *   ex_WndTarget)
    {
       CFont   font;
       font.Create(・・・・);// ここでfontを構築
       ex_WndTarget->SetFont( &font); // ターゲットにフォントを設定
      :
    } // しかし、ここでCFont::~CFont() デストラクタが実行されて
     // fontは破棄されて無効になる

    以上の様に、

    1.C++などのオブジェクト指向言語においては、
     オブジェクトの寿命に配慮しないでコードを書くことは、
     ほぼ不可能と断言できます。

    次に、
    「どのタイミングで設定すれば良いのか」とのご質問ですが、
    CWnd::SetFont()はソースを見れば次のようなコードになっています。

    _AFXWIN_INLINE void CWnd::SetFont(CFont* pFont, BOOL bRedraw)
    { ASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, WM_SETFONT, (WPARAM)pFont->GetSafeHandle(), bRedraw); }

    つまり、対象CWndのHWNDに対して、WM_SETFONTメッセージを送付しているわけですね。
    従って、次のことがわかります。

    2.HWNDにメッセージが送付できるのはそれが有効である場合です。

    以上を参考にしてみてはどうでしょう。

    2013年8月7日 1:56

すべての返信

  • 対象CDialogBar、及び対象CEditの生成方法やそれらの構成により
    やや異なる複数の方法が考えられるため、一般論のみ提示します。

    1.CWndオブジェクトのフォントを設定するには、
      CWnd::SetFont()を使用します。
    2.設定するフォントCFontオブジェクトの寿命は、
      対象CWndより長寿でなければなりません。
    3.ダイアログの子コントロールを取得するには、
      CWnd::GetDlgItem()を使用しますが、
      戻されるCWndオブジェクトは一時的なもので、
      保存的に使用することができない点に注意が必要です。

    2013年8月6日 5:49
  • 仲澤@失業者様

    アドバイス有難うございます。

    以下のようにしてみましたが大きな変化はありません。

    CDialogBar* pBar = (CDialogBar*)AfxGetApp()->m_pMainWnd->GetDlgItem(AFX_IDW_TOOLBAR);
    CFont font;
    font.CreatePointFont(200, "MS 明朝");
    CEdit* pEdit = (CEdit *)pBar->GetDlgItem(IDC_TEXT);
    pEdit->SetFont(&font, TRUE);

    OnInitDialog()が使えないので表示直前に行なっていますが、どのタイミングで設定すれば良いのでしょうか?

    2013年8月6日 8:32
  • まず、
    ご提示のコードがどこにコードされたのかわかりませんので、なんとも回答しかねます。
    というのは、これではオブジェクトの寿命がまったくわからないからですね。

    たとえば、以下のコードには効果がありません。

    void SetFont_to_Wnd(
      CWnd *   ex_WndTarget)
    {
       CFont   font;
       font.Create(・・・・);// ここでfontを構築
       ex_WndTarget->SetFont( &font); // ターゲットにフォントを設定
      :
    } // しかし、ここでCFont::~CFont() デストラクタが実行されて
     // fontは破棄されて無効になる

    以上の様に、

    1.C++などのオブジェクト指向言語においては、
     オブジェクトの寿命に配慮しないでコードを書くことは、
     ほぼ不可能と断言できます。

    次に、
    「どのタイミングで設定すれば良いのか」とのご質問ですが、
    CWnd::SetFont()はソースを見れば次のようなコードになっています。

    _AFXWIN_INLINE void CWnd::SetFont(CFont* pFont, BOOL bRedraw)
    { ASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, WM_SETFONT, (WPARAM)pFont->GetSafeHandle(), bRedraw); }

    つまり、対象CWndのHWNDに対して、WM_SETFONTメッセージを送付しているわけですね。
    従って、次のことがわかります。

    2.HWNDにメッセージが送付できるのはそれが有効である場合です。

    以上を参考にしてみてはどうでしょう。

    2013年8月7日 1:56
  • 仲澤@失業者様

    コードはViewに書いています。

    もしやと思い font をグローバルにしたらうまくいきました。

    アドバイス有難うございました。

    2013年8月7日 9:50