改变push button背景色
在windows中edit,staticbox的背景色都可以通过处理wm_ctlcolor消息来改变,但push button却不行。
唯一的方法是使用ownerdraw风格的按钮。本文讲述的方法是使用cbutton的派生类。
class ccbutton : public cbutton
{
declare_dynamic(ccbutton)
public:
ccbutton();
virtual ~ccbutton();
bool ccbutton::attach(const uint nid, cwnd* pparent)
protected:
virtual void drawitem(lpdrawitemstruct lpdis);//必需重载的函数
public:
colorref m_fg, m_bg, m_disabled_fg, m_disabled_bg;//四种颜色分别为文字,背景,失效时文字,失效时背景
};
实现drawitem
void ccbutton::drawitem(lpdrawitemstruct lpdis)
{
cdc* pdc = cdc::fromhandle(lpdis->hdc);//???????dc
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;
//
// 得当button上文字
//
const int bufsize = 512;
tchar buffer[bufsize];
getwindowtext(buffer, bufsize);
// 使用m_fg, m_bg颜色利用 draw3drect(...)绘制按钮边框
// fillrect(...)填充按钮内部
// drawtext(...)绘制文字
//根据当前状态调整显示
//
if (state & ods_focus) {
.........//得到输入焦点,通过focusrect画虚线
if (state & ods_selected){
.....// 被按下,绘制下陷边框
}
}
else if (state & ods_disabled) {
//失效,通过m_disabled_fg, m_disabled_bg 重绘按钮内部
}
}
ccbutton是cbutton派生类,具有cbutton的全部成员函数,但在创建时需要使用bs_ownerdraw风格。
如果按钮不是动态生成,使用attach函数使ccbutton代替原来按钮的窗口过程。
bool ccbutton::attach(const uint nid, cwnd* pparent)
{
getdlgitem(nid)->modifystyle(0,bs_ownerdraw,0);
if (!subclassdlgitem(nid, pparent))
return false;
return true;
}
如在一对话框的initdialog(...)中加入下面几行
{// 假定 m_cbbtn为成员变量 idc_button1为一按钮id值
m_cbbtn.attach(idc_button1,this);
}