改变Push Button背景色

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 sjc0722 的 blog

改变push button背景色

  改变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);

}

    

本文关键:改变Push Button背景色
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top