通过自绘按钮的方式创建有颜色的按钮类ClrButton
ClrButton.h
#pragma once
const COLORREF clrWhite = RGB(255, 255, 255);
const COLORREF clrBlack = RGB(1, 1, 1);
const COLORREF clrRed = RGB(255, 0, 0);
const COLORREF clrGreen = RGB(0, 255, 0);
const COLORREF clrBlue = RGB(0, 0, 255);
const COLORREF clrCyan = RGB(0, 255, 255);
const COLORREF clrMagenta = RGB(255, 0, 255);
const COLORREF clrYellow = RGB(255, 255, 0);
const COLORREF ClrLlGray = RGB(220, 220, 220);
const COLORREF ClrLtGrayLTGRAY = RGB(192, 192, 192);
const COLORREF ClrDkGray = RGB(128, 128, 128);
const COLORREF ClrDdGray = RGB(64, 64, 64);
const COLORREF clrButtonFace=RGB(240,240,240);
const COLORREF clrButtonSelected=RGB(240,0,240);
const COLORREF clrButtonFocus=RGB(0,0,240);
const COLORREF clrText=RGB(0,0,0);
const COLORREF clrHighLightText=RGB(255,255,255);
// CClrButton
class CClrButton : public CButton
{
DECLARE_DYNAMIC(CClrButton)
public:
CClrButton();
virtual ~CClrButton();
protected:
DECLARE_MESSAGE_MAP()
public:
virtual void PreSubclassWindow();
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
COLORREF m_clrText;
COLORREF m_clrFace;
COLORREF m_clrBack;
void SetColor(COLORREF clrText,COLORREF clrFace,COLORREF clrBack);
};
ClrButton.cpp
// ClrButton.cpp : 实现文件
//
#include "stdafx.h"
#include "ClrButton.h"
// CClrButton
IMPLEMENT_DYNAMIC(CClrButton, CButton)
CClrButton::CClrButton()
{
m_clrText=clrBlack;
m_clrFace=clrButtonFace;
m_clrBack=clrMagenta;
}
CClrButton::~CClrButton()
{
}
BEGIN_MESSAGE_MAP(CClrButton, CButton)
END_MESSAGE_MAP()
// CClrButton 消息处理程序
void CClrButton::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
ModifyStyle(0, BS_OWNERDRAW);//设置自绘
CButton::PreSubclassWindow();
}
void CClrButton::SetColor(COLORREF clrText,COLORREF clrFace,COLORREF clrBack)
{
m_clrText=clrText;
m_clrFace=clrFace;
m_clrBack=clrBack;
Invalidate(FALSE);
}
void CClrButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//设置区域->填充背景色->绘制文字->绘制边缘->绘制焦点线
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
CRect rectCtrl;
rectCtrl.CopyRect(&lpDrawItemStruct->rcItem);
UINT nState=lpDrawItemStruct->itemState;
//1,设置为圆角
// CRgn rgnCtrl;
// rgnCtrl.CreateRoundRectRgn (0, 0, rectCtrl.Width(),rectCtrl.Height(),4,4);
// dc.SelectClipRgn(&rgnCtrl);
// SetWindowRgn(rgnCtrl,TRUE);
//填充背景
CRect rectUp;
CRect rectLow;
rectUp=rectCtrl;
rectLow=rectCtrl;
// rectUp.bottom=rectCtrl.top+rectCtrl.Height()/2;
// rectLow.top=rectUp.bottom;
// dc.FillSolidRect(rectUp,RGB(10,10,240));
// dc.FillSolidRect(rectLow,RGB(0,0,240));
//按钮按下状态,文字和图标稍微偏移
if (nState & ODS_SELECTED)
{
// rectUp.bottom=rectUp.bottom+2;
// rectLow.top=rectUp.bottom;
// dc.FillSolidRect(rectUp,RGB(230,230,240));
// dc.FillSolidRect(rectLow,RGB(215,215,240));
// rectCtrl.OffsetRect(1,1);
dc.FillSolidRect(rectCtrl,m_clrBack);
}
else
{
//按钮选中状态
if ( (nState & ODS_FOCUS) || (nState & ODS_DEFAULT) )
{
dc.FillSolidRect(rectCtrl,m_clrBack);
}
else
{
dc.FillSolidRect(rectCtrl,m_clrFace);
}
}
//画图标
// int nH=rectCtrl.Height();
// CRect rectIcon=rectCtrl;
// rectIcon.right=nH;
// rectIcon.DeflateRect((nH-16)/2,(nH-16)/2);
// ::DrawIconEx(dc.GetSafeHdc(),rectIcon.left,rectIcon.top,m_hIcon,16,16,0,0,DI_NORMAL);
//画文字
CString strText;
GetWindowText(strText);
if (nState & ODS_SELECTED)
{
dc.SetTextColor(m_clrText);
}
else
{
//按钮选中状态
if ( (nState & ODS_FOCUS) || (nState & ODS_DEFAULT) )
{
dc.SetTextColor(m_clrText);
}
else//常规状态
{
dc.SetTextColor(m_clrText);
}
}
dc.SetBkMode(TRANSPARENT);
dc.DrawText(strText,rectCtrl,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
//画边缘(凸起或者下陷的)
CRect rectBorder;
rectBorder=rectCtrl;
if (nState & ODS_SELECTED)
{
dc.DrawEdge(&rectCtrl,BDR_SUNKENOUTER,BF_RECT);
rectBorder.DeflateRect(1,1);
dc.DrawFocusRect(rectBorder); //画虚线
}
else
{
//按钮选中状态
if ( (nState & ODS_FOCUS) || (nState & ODS_DEFAULT) )
{
dc.DrawEdge(&rectCtrl,BDR_RAISEDOUTER,BF_RECT);
}
else
{
dc.DrawEdge(&rectCtrl,BDR_RAISEDOUTER,BF_RECT);
}
}
dc.Detach();
}