Last Updated 2004/06/10
Programming Tips Visual C++ MFC CButton  索 引 
ボタンのフォント(オーナー描画)
2004/06/10

ボタンのフォントを変更する.
オーナー描画にて実装する.

const BOOL CreateLargeFont(CDC& dc, CFont& font)
{
    BOOL bFlag = FALSE;
    TEXTMETRIC tm;
    if( dc.GetTextMetrics(&tm) ) {
        LOGFONT logfont;
        ::memset(&logfont, 0, sizeof(logfont));
        logfont.lfHeight  = tm.tmHeight * 6 / 5;    // 20%大きくする
        logfont.lfCharSet = SHIFTJIS_CHARSET;
        ::_tcscpy(logfont.lfFaceName, _T("MS Pゴシック"));
        bFlag = font.CreateFontIndirect(&logfont);
    }
    return bFlag;
}

const BOOL DrawString(CDC& dc, CString& str, RECT& rect, COLORREF color)
{
    CFont font;
    if( CreateLargeFont(dc, font) ) {
        const COLORREF colorOld = dc.SetTextColor(color);
        CFont* const pFontOld = dc.SelectObject(&font);

        dc.DrawText(str, &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER | DT_END_ELLIPSIS);

        dc.SetTextColor(colorOld);
        dc.SelectObject(pFontOld);
        return TRUE;
    }
    return FALSE;
}

void Dialog1::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    ASSERT_POINTER(lpDrawItemStruct, DRAWITEMSTRUCT);
    if( lpDrawItemStruct->CtlType == ODT_BUTTON &&
        lpDrawItemStruct->CtlID   == IDC_BUTTON1 ) {
        CDC dc;
        dc.Attach(lpDrawItemStruct->hDC);
        CRect rect(lpDrawItemStruct->rcItem);
        dc.FillSolidRect(&rect, ::GetSysColor(COLOR_BTNFACE));
        if( (lpDrawItemStruct->itemState & ODS_SELECTED) == 0 ) {
            dc.DrawEdge(&rect, EDGE_RAISED, BF_RECT);
        } else {
            dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT);
        }

        rect.InflateRect(-1, -1);
        CString str;
        GetDlgItem(IDC_BUTTON1)->GetWindowText(str);
        DrawString( dc, str, rect, ::GetSysColor(((lpDrawItemStruct->itemState & ODS_DISABLED) == 0) ? COLOR_BTNTEXT : COLOR_GRAYTEXT) );
        if( (lpDrawItemStruct->itemState & ODS_FOCUS) != 0 ) {
            rect.InflateRect(-3, -3);
            dc.DrawFocusRect(rect);
        }
        dc.Detach();
    } else {
        CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
    }
}

ボタンの派生クラスを作成して WM_DRAWITEM のハンドラを追加する方法もある.
この場合は,ダイアログの WM_DRAWITEM は必要ない.


参照
ボタンの色
ボタンのフォント
ボタンにビットマップ表示
ボタンのオーナー描画
前後のTips
ボタンのフォント(オーナー描画)

DSS ProgrammingTipsCGI Ver2.01