VC6.0 改变按钮颜色及文字颜色(2)

来源:互联网 发布:淘宝很费流量 编辑:程序博客网 时间:2024/05/17 20:25

文章地址http://blog.csdn.net/yanjiaye520/article/details/5044113


头文件:CMyButton.h 如下:

#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;
};


源文件:CMyButton.cpp

#include "StdAfx.h"
#include "CMyButton.h"

CMyButton::CMyButton(void)
{
 m_DownColor = m_UpColor = RGB(0,0,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();//
}

 

调用CMyButton类的方式:

在对话框类头文件中#include "CMyButton.h",再在对话框类中找到函数OnInitDialog()如果找不到可以在对话框事件属性中重载出来,

其中m_cbBtn变量的声明为:

 CMyButton m_cbBtn;//这句可以放在类的其他地方,只要合法就行

 //将按钮修改为BS_OWNERDRAW风格,其他风格无效

 GetDlgItem(IDC_BUTTON1)->ModifyStyle(0,BS_OWNERDRAW,0);

 //绑定控件IDC_BUTTON1与类CMyButton,响应重载函数DrawItem()
 m_cbBtn.Attach(IDC_BUTTON1,this);

 //设置Button Down的背景色
 m_cbBtn.SetDownColor(RGB(255,0,0));

 //设置Button Up的背景色
 m_cbBtn.SetUpColor(RGB(0,0,255));

 

PS:如果连接代码时在m_cbBtn.Attach(IDC_BUTTON1,this);这句产生中断,可能的原因是IDC_BUTTON1控件已经绑定了一次消息,这里再次绑定当然不成功啦,

改正方法为:将映射函数DoDataExchange()中

//DDX_Control(pDX, IDC_BUTTON1, m_cbBtn);//这句注释掉就可以了。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 三星玩王者荣耀卡怎么办 华为麦芒5网络差怎么办 华为麦芒无线信号不好怎么办 华为麦芒6网络不好怎么办 华为麦芒6信号差怎么办 华为手机无线网信号差怎么办 华为麦芒6数据信号差怎么办 华为麦芒54g信号差怎么办 华为手机wifi信号差怎么办 华为手机导航信号弱怎么办 华为手机gps信号弱怎么办 麦芒5指纹消失了怎么办 华为应用锁密码忘了怎么办 华为麦芒5密码忘了怎么办 华为卡1无服务怎么办 经常卡1无服务怎么办 华为手机进水无服务怎么办 苹果手机进水后无服务怎么办 苹果6进水无服务怎么办 华为手机突然无服务怎么办 sim卡显示无服务怎么办 华为麦芒进水无限开关机怎么办 华为麦芒5进水黑屏怎么办 华为麦芒6进水了怎么办 4g手机开不开机怎么办 全屏钢化膜总是翘边怎么办 华为麦芒屏幕触屏失灵怎么办 华为麦芒5运行慢怎么办 手机屏保密码忘记了怎么办 麦芒5密码锁忘了怎么办 超薄手机壳松了怎么办 华为麦芒5声音小怎么办 笔记本外壳a面裂了怎么办 苹果手机外壳摔坏了怎么办 挂衣服肩膀出包怎么办 摩拜单车手机号注销了怎么办 摩拜单车手机号码换了怎么办 摩拜单车换手机号码打不开怎么办 摩拜单车丢了怎么办 摩拜单车忘锁了怎么办 透明手机壳粘指纹怎么办