ボタンのフォントを変更する.
オーナー描画にて実装する.
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 は必要ない.
参照
ボタンの色
ボタンのフォント
ボタンにビットマップ表示
ボタンのオーナー描画