#pragma once #include "afxwin.h"   class CMyButton : public CButton { //DECLARE_DYNAMIC(CMyButton) public: CMyButton(); virtual ~CMyButton(); //设置Button Down的背景颜色     void SetDownColor(COLORREF color);     //设置Button Up的背景颜色 void SetUpColor(COLORREF color); BOOL Attach(const UINT nID, CWnd* pParent);   protected:       //必需重载的函数     virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);   public: //三种颜色分别为文字,Button Down的背景颜色,Button Up的背景颜色 COLORREF m_TextColor, m_DownColor, m_UpColor; };

#include "StdAfx.h" #include "CMyButton.h"  CMyButton::CMyButton(void) { m_DownColor = m_UpColor = RGB(210,120,0); }  CMyButton::~CMyButton(void) { }  //CMyButton是CButton派生类,具有CButton的全部成员函数,  //但在创建时需要使用BS_OWNERDRAW风格。  //如果按钮不是动态生成,使用Attach函数使CMyButton代替原来按钮的窗口过程。  BOOL CMyButton::Attach(const UINT nID, CWnd* pParent) { //GetDlgItem(nID)->ModifyStyle(0,BS_OWNERDRAW,0);  if (!SubclassDlgItem(nID, pParent))      return FALSE;  return TRUE; }  void CMyButton::SetDownColor(COLORREF color) { m_DownColor = color; }  void CMyButton::SetUpColor(COLORREF color) { m_UpColor = color; }   void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your code to draw the specified item CDC dc; dc.Attach(lpDrawItemStruct->hDC);//得到绘制的设备环境CDC VERIFY(lpDrawItemStruct->CtlType==ODT_BUTTON);   // 得当Button上文字,这里的步骤是:1,先得到在资源里编辑的按钮的文字,  //然后将此文字重新绘制到按钮上, //同时将此文字的背景色设为透明,这样,按钮上仅会显示文字  const int bufSize = 512; TCHAR buffer[bufSize]; GetWindowText(buffer, bufSize);  int size=strlen(buffer);   //得到长度 DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct->rcItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);   //绘制文字 SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);   //透明   if (lpDrawItemStruct->itemState & ODS_SELECTED)  //当按下按钮时的处理 {//   //重绘整个控制   CBrush brush(m_DownColor);     dc.FillRect(&(lpDrawItemStruct->rcItem),&brush);//    //因为这里进行了重绘,所以文字也要重绘   DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct->rcItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);      SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);       } else                       //当按钮不操作或者弹起时 {   CBrush brush(m_UpColor);        dc.FillRect(&(lpDrawItemStruct->rcItem),&brush);//    //同上,进行重绘文字   DrawText(lpDrawItemStruct->hDC,buffer,size,&lpDrawItemStruct->rcItem,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_TABSTOP);       SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT); }  if ((lpDrawItemStruct->itemState & ODS_SELECTED )&&(lpDrawItemStruct->itemAction &(ODA_SELECT| ODA_DRAWENTIRE))) {   //选中了本控件,高亮边框   COLORREF fc=RGB(255-GetRValue(m_UpColor),255-GetGValue(m_UpColor), 255- GetBValue(m_UpColor));//   CBrush brush(fc);//   dc.FrameRect(&(lpDrawItemStruct->rcItem),&brush);//  } if (!(lpDrawItemStruct->itemState & ODS_SELECTED) &&(lpDrawItemStruct->itemAction & ODA_SELECT)) {   //控制的选中状态结束,去掉边框   CBrush brush(m_UpColor);   dc.FrameRect(&lpDrawItemStruct->rcItem,&brush);//  } dc.Detach();// }