有颜色的按钮类ClrButton

通过自绘按钮的方式创建有颜色的按钮类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();


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值