VC++でテキストボックスを等幅フォントにしたい

[戻る]
yama1 [E-Mail] 2014/07/17(木) 17:30:32
VC++でテキストボックスのフォントを等幅フォントにしたいです。
Visual Studio2008を使用しています。
今は以下のように設定したのですが、幅も等幅ではないですし、
文字も大きすぎて縦に重なってしまいます。
何か良い方法はありませんか?

    // IDC_EDITBOX は文字を追加するエディットボックスのID
    CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT5);
    int nLastPos = pEdit->GetWindowTextLength();
    BOOL bFocus = FALSE;

    // フォーカスを一時退避
    if (::GetFocus() == pEdit->m_hWnd)
    {
        bFocus = TRUE;
        GetDlgItem(IDOK)->SetFocus();
    }

    LOGFONT log_font; 
    GetFont()->GetLogFont( &log_font );
    sprintf(log_font.lfFaceName,"%s","Terminal");
    CFont font;
    font.CreateFontIndirect(&log_font);
    pEdit->SetFont(&font);

    // 文字を追加
    pEdit->SetSel(nLastPos, nLastPos);
    pEdit->ReplaceSel(lpText);

    // フォーカスを戻す
    if (bFocus)
        pEdit->SetFocus();

仲澤@失業者 2014/07/17(木) 18:01:59
まず、フォントを自前で初期化してみます。
フォント本体であるCFontは、破棄されないように、
エディットよりも寿命の長い、エディットの親DLG等のメンバーにします。

-------以下の部分は親のメンバ-------
class MyDlg : public CDialog{
    :
protected:
  CFont m_font; // Editのフォント
    :
};
-------以下はOnInitDialog()等で行う------
BOOL
MyDlg::OnInitDialog()
{ 
     :
LOGFONT    lf;
ZeroMemory( &lf, sizeof( lf));
strcpy( lf.lfFaceName, "MS ゴシック");
lf.lfHeight        = -8;  // 文字の大きさ
lf.lfCharSet        = DEFAULT_CHARSET;
lf.lfOutPrecision    = OUT_TT_PRECIS;
lf.lfClipPrecision    = CLIP_DEFAULT_PRECIS;
lf.lfQuality        = DEFAULT_QUALITY;
lf.lfPitchAndFamily    = FF_DONTCARE | FIXED_PITCH;// ピッチ指定
lf.lfWeight        = FW_DONTCARE;
m_font.CreateFontIndirect( &lf);// 作成
pEdit->SetFont( m_font, TRUE);//エディットに設定
    :
}

とりあえず、やってみてください。

AR 2014/07/17(木) 18:03:00
 この記述、例えばボタンを押した時のイベントハンドラなどに書いてるのではないで
しょうか?
 であれば、このメソッドを抜けた時に、フォントが破棄されてるので、不定なフォント
が表示されているのではないかと推測します。

 ですから
CFont font;
font.CreateFontIndirect(&log_font);
pEdit->SetFont(&font);

これを

CFont *font = new CFont();
font->CreateFontIndirect(&log_font);
pEdit->SetFont(font);

 こうすると、開放の記述が無いのでメモリリークしますが、フォントは維持されるので
はないかと思います。
 生成と開放はInitDialog()の中でフォントを生成し、ダイアログを閉じるタイミングで
フォントを破棄するようにすると簡単です。

AR 2014/07/17(木) 18:04:04
orz被ってしまいました

yama1 [E-Mail] 2014/07/18(金) 09:24:58
仲澤さん

回答ありがとうございました。
等幅フォントできました。
解決です。
ありがとうございました。

ARさん

回答ありがとうございました。
メソッドを抜けた時に、フォントが破棄されていたのだと思います。

古いスレッドには追加発言できません。