//定义色彩const COLORREF CLOUDBLUE = RGB(128, 184, 223);const COLORREF WHITE = RGB(255, 255, 255);const COLORREF BLACK = RGB(1, 1, 1);const COLORREF DKGRAY = RGB(128, 128, 128);const COLORREF LTGRAY = RGB(192, 192, 192);const COLORREF YELLOW = RGB(255, 255, 0);const COLORREF DKYELLOW = RGB(128, 128, 0);const COLORREF RED = RGB(255, 0, 0);const COLORREF DKRED = RGB(128, 0, 0);const COLORREF BLUE = RGB(0, 0, 255);const COLORREF DKBLUE = RGB(0, 0, 128);const COLORREF CYAN = RGB(0, 255, 255);const COLORREF DKCYAN = RGB(0, 128, 128);const COLORREF GREEN = RGB(0, 255, 0);const COLORREF DKGREEN = RGB(0, 128, 0);const COLORREF MAGENTA = RGB(255, 0, 255);const COLORREF DKMAGENTA = RGB(128, 0, 128);//在.h文件定义彩色按钮CColorButton m_btnUp;//在.cpp文件调用函数着色VERIFY(m_btnUp.Attach(IDC_BUTTON1, this, RED, WHITE, DKRED));//CColorButton 类原型//colorbtn.h#ifndef __COLORBTN_H__#define __COLORBTN_H__class CColorButton : public CButton{DECLARE_DYNAMIC(CColorButton)public:CColorButton();virtual ~CColorButton();BOOL Attach(const UINT nID, CWnd* pParent,const COLORREF BGColor = RGB(192, 192, 192), // gray button const COLORREF FGColor = RGB(1, 1, 1), // black textconst COLORREF DisabledColor = RGB(128, 128, 128), // dark gray disabled textconst UINT nBevel = 2);protected:virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);void DrawFrame(CDC *DC, CRect R, int Inset);void DrawFilledRect(CDC *DC, CRect R, COLORREF color);void DrawLine(CDC *DC, CRect EndPoints, COLORREF color);void DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color);void DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor);COLORREF GetFGColor() { return m_fg; }COLORREF GetBGColor() { return m_bg; }COLORREF GetDisabledColor() { return m_disabled; }UINT GetBevel() { return m_bevel; }private:COLORREF m_fg, m_bg, m_disabled;UINT m_bevel;};#endif//colorbtn.cpp#include "stdafx.h "#include "colorbtn.h "#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif#ifdef CColorButton#undef CColorButton CColorButton#endifIMPLEMENT_DYNAMIC(CColorButton, CButton)CColorButton::CColorButton(){#if (_MFC_VER < 0x0250)hwndOwner = NULL;#endif}CColorButton::~CColorButton(){}BOOL CColorButton::Attach(const UINT nID, CWnd* pParent, const COLORREF BGColor, const COLORREF FGColor, const COLORREF DisabledColor, const UINT nBevel){if (!SubclassDlgItem(nID, pParent))return FALSE;m_fg = FGColor;m_bg = BGColor;m_disabled = DisabledColor;m_bevel = nBevel;return TRUE;}void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS){CDC* pDC = CDC::FromHandle(lpDIS-> hDC);UINT state = lpDIS-> itemState;CRect focusRect, btnRect;focusRect.CopyRect(&lpDIS-> rcItem);btnRect.CopyRect(&lpDIS-> rcItem);focusRect.left += 4;focusRect.right -= 4;focusRect.top += 4;focusRect.bottom -= 4;const int bufSize = 512;TCHAR buffer[bufSize];GetWindowText(buffer, bufSize);DrawFilledRect(pDC, btnRect, GetBGColor());DrawFrame(pDC, btnRect, GetBevel());DrawButtonText(pDC, btnRect, buffer, GetFGColor());if (state & ODS_FOCUS) {DrawFocusRect(lpDIS-> hDC, (LPRECT)&focusRect);if (state & ODS_SELECTED){DrawFilledRect(pDC, btnRect, GetBGColor());DrawFrame(pDC, btnRect, -1);DrawButtonText(pDC, btnRect, buffer, GetFGColor()); DrawFocusRect(lpDIS-> hDC, (LPRECT)&focusRect);}}else if (state & ODS_DISABLED) {DrawButtonText(pDC, btnRect, buffer, GetDisabledColor()); }}void CColorButton::DrawFrame(CDC *DC, CRect R, int Inset) {COLORREF dark, light, tlColor, brColor;int i, m, width;width = (Inset < 0)? -Inset : Inset;for (i = 0; i < width; i += 1) {m = 255 / (i + 2);dark = PALETTERGB(m, m, m);m = 192 + (63 / (i + 1));light = PALETTERGB(m, m, m);if ( width == 1 ) {light = RGB(255, 255, 255);dark = RGB(128, 128, 128);}if ( Inset < 0 ) {tlColor = dark;brColor = light;}else {tlColor = light;brColor = dark;}DrawLine(DC, R.left, R.top, R.right, R.top, tlColor); // Across topDrawLine(DC, R.left, R.top, R.left, R.bottom, tlColor); // Down leftif ( (Inset < 0) && (i == width - 1) && (width > 1) ) {DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, RGB(1, 1, 1));// Across bottomDrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, RGB(1, 1, 1)); // Down right}else {DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, brColor); // Across bottomDrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, brColor); // Down right}InflateRect(R, -1, -1);}}void CColorButton::DrawFilledRect(CDC *DC, CRect R, COLORREF color){CBrush B;B.CreateSolidBrush(color);DC-> FillRect(R, &B);}void CColorButton::DrawLine(CDC *DC, CRect EndPoints, COLORREF color){CPen newPen;newPen.CreatePen(PS_SOLID, 1, color);CPen *oldPen = DC-> SelectObject(&newPen);DC-> MoveTo(EndPoints.left, EndPoints.top);DC-> LineTo(EndPoints.right, EndPoints.bottom);DC-> SelectObject(oldPen);newPen.DeleteObject();}void CColorButton::DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color){CPen newPen;newPen.CreatePen(PS_SOLID, 1, color);CPen *oldPen = DC-> SelectObject(&newPen);DC-> MoveTo(left, top);DC-> LineTo(right, bottom);DC-> SelectObject(oldPen);newPen.DeleteObject();}void CColorButton::DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor){COLORREF prevColor = DC-> SetTextColor(TextColor);DC-> SetBkMode(TRANSPARENT);DC-> DrawText(Buf, strlen(Buf), R, DT_CENTER and DT_VCENTER and DT_SINGLELINE);DC-> SetTextColor(prevColor);}能够实现的代码:要想修改CButton类按钮背景颜色和文字颜色,必须利用自绘方法对按钮进行重新绘制。