通过重绘CButton类。
主要思路:先把按钮属性OwerDraw设置成true
然后覆写CButton类的DrawItem虚函数。
void CCustomButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CRect rect;
GetClientRect(rect);
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
UINT state = lpDrawItemStruct->itemState;
//绘制处于焦点的按钮
COLORREF colorFocus(RGB(0, 128, 0));
CPen penFocus(PS_DASHDOTDOT, 2, colorFocus);
CBrush brushFocus;
//绘制普通按钮
COLORREF color(RGB(0, 128, 255));
CPen pen(PS_DASHDOTDOT, 2, RGB(0, 128, 255));
CBrush brush;
if ((state & ODS_SELECTED) || (state & ODS_FOCUS)) {
brushFocus.CreateSolidBrush(colorFocus);
dc.SelectObject(&brushFocus);
dc.SelectObject(&penFocus);
dc.FillSolidRect(rect,m_bgColor);
dc.RoundRect(rect, CPoint(20, 20));
} else {
brush.CreateSolidBrush(color);
dc.SelectObject(&brush);
dc.SelectObject(&pen);
dc.FillSolidRect(rect, m_bgColor);
dc.RoundRect(rect, CPoint(20, 40));
}
CString strText;
GetWindowText(strText);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(m_textColor);
// 绘制不可按的按钮
COLORREF colorDisable(RGB(128, 128, 128));
CBrush brushDisable;
brushDisable.CreateSolidBrush(colorDisable);
CPen penDisable(PS_DASHDOTDOT, 2, colorDisable);
if (state & ODS_DISABLED) {
dc.SelectObject(penDisable);
dc.SelectObject(brushDisable);
dc.RoundRect(rect, CPoint(20, 40));
}
dc.SetTextColor(RGB(255, 255, 255));
dc.DrawText(strText, rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
dc.Detach();
}