怎样修改CListBox的背景色?
越简单越好。

解决方案 »

  1.   

    改变控件的颜色
      需要改变控件的颜色,可以通过两种方法,其一,可以在父类中指定控件的颜色。其二,利用消息反射在控件类中指定颜色。  当控件需要重新着色时,工作框调用父窗口(通常是对话框)的cwnd::onctlcolor,可以在父窗口类中重置该函数并指定新的绘画属性。  如下所示,将对话框中的编辑控件的文本颜色改为蓝色。  hbrush cmydialog::onctlcolor(cdc* pdc,cwnd* pwnd,uint nctlcolor)  {  hbrush hbr=cdialog::onctlcolor(pdc,pwnd,nctlcolor);  //draw blue text for edit controls  if(nctlcolor==cltcolor—edit)  pdc->settextcolor(rgb(0,0,255));  return hbr;  }  由于每个窗口必须处理通知消息并指定每个控件的绘画属性,所以,这种方法不是完全的面向对象的方法,控件处理该消息并指定绘画属性更合理一些。  消息反射允许用户这样做,通知消息发给父窗口,若父窗口没有处理则发给控件,创建一个定制彩色列表框控件,其步骤如下。  首先用classwizard创建一个clistbox的派生类,并添加如下的成员变量。  class cmylistbox::public clistbox  {  ...  private :  colorref m—clrfore; //foreground color  colorref m—clrback; //background color  cbrush m—brush ; //background brush  ...  };  其二,在类的构造函数中初始化数据成员。  cmylistbox::cmylistbox()  {  //initialize data members  m—clrfore=rgb(255,0,0); //red text  m—clrback=rgb(0,255,0);   //green background  m—brush.createsolidbrush(m—clrback);  }  第三,使用classwizard处理反射消息(=wm—ctlcolor)并指定新的绘画属性。  hbrush cmylistbox::ctlcolor(cdc* pdc,uint nctlcolor)  {  pdc->settextcolor(m—clrfore);  pdc->setbkcolor(m—clrback);  return (hbrush)m—brush.getsafehandle();  }  现在控件可以重画自身,与父窗口无关。  最后,在父窗口头文件中包含派生的cmylistbox类,然后用classwizard 定义列表框控件的成员变量即可。其成员变量的类性为cmylistbox。 这样我们就完成了控件的着色。
      

  2.   

    http://www.codeproject.com/combobox/xlistbox.asp
      

  3.   

    to HunterForPig(留着口水的猪) :
    你的代码是修改有文字部分的背景, 没文字部分的背景还是没被修改。
      

  4.   

    to  vcleaner(我没做大哥已经很久了.......) :
    你们可能误解我的意思了,
    我不是指有文字部分的背景。
      

  5.   

    你可以通过重载OnCtlColor实现:
    HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    COLORREF clr;
    HBRUSH m_brMine;
    switch(nCtlColor)
    {
    case CTLCOLOR_LISTBOX:
    clr = RGB(160,0,0);
    pDC->SetTextColor(clr);   //设置黑色的文本

    clr = RGB(166,210,210);
    pDC->SetBkColor(clr);     //设置淡蓝色的背景

    m_brMine = ::CreateSolidBrush(clr);
    return m_brMine; //返回对应的刷子句柄

    default:
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    return hbr;
    }
    }