改变Push Button背景色的方法
改变Push Button背景色的方法
改变PushButton背景色
在Windows中Edit,StaticBox的背景色都可以通过处理WM_CTLCOLOR消息来改变,但PushButton却不行。
唯一的方法是使用OwnerDraw风格的按钮。本文讲述的方法是使用CButton的派生类。
classCCButton:publicCButton
{
DECLARE_DYNAMIC(CCButton)
public:
CCButton();
virtual~CCButton();
BOOLCCButton::Attach(constUINTnID,CWnd*pParent)
protected:
virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDIS);//必需重载的函数
public:
COLORREFm_fg,m_bg,m_disabled_fg,m_disabled_bg;//四种颜色分别为文字,背景,失效时文字,失效时背景
};
实现DrawItem
voidCCButton::DrawItem(LPDRAWITEMSTRUCTlpDIS)
{
CDC*pDC=CDC::FromHandle(lpDIS->hDC);//???????DC
UINTstate=lpDIS->itemState;//得到状态
CRectfocusRect,btnRect;//两个矩形,表示得当输入焦点时的虚线矩形和按钮矩形
focusRect.CopyRect(&lpDIS->rcItem);
btnRect.CopyRect(&lpDIS->rcItem);
//
//调整虚线矩形
//
focusRect.left+=4;
focusRect.right-=4;
focusRect.top+=4;
focusRect.bottom-=4;
//
//得当Button上文字
//
constintbufSize=512;
TCHARbuffer[bufSize];
GetWindowText(buffer,bufSize);
//使用m_fg,m_bg颜色利用Draw3dRect(...)绘制按钮边框
//FillRect(...)填充按钮内部
//DrawText(...)绘制文字
//根据当前状态调整显示
//
if(state&ODS_FOCUS){
.........//得到输入焦点,通过focusRect画虚线
if(state&ODS_SELECTED){
.....//被按下,绘制下陷边框
}
}
elseif(state&ODS_DISABLED){
//失效,通过m_disabled_fg,m_disabled_bg重绘按钮内部
}
}
CCButton是CButton派生类,具有CButton的全部成员函数,但在创建时需要使用BS_OWNERDRAW风格。
如果按钮不是动态生成,使用Attach函数使CCButton代替原来按钮的窗口过程。
BOOLCCButton::Attach(constUINTnID,CWnd*pParent)
{
GetDlgItem(nID)->ModifyStyle(0,BS_OWNERDRAW,0);
if(!SubclassDlgItem(nID,pParent))
returnFALSE;
returnTRUE;
}
如在一对话框的InitDialog(...)中加入下面几行
{//假定m_cbBtn为成员变量IDC_BUTTON1为一按钮ID值
m_cbBtn.Attach(IDC_BUTTON1,this);
}