Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Alternate Row Colors for the CListCtrl

0.00/5 (No votes)
19 Dec 2005 1  
How to set alternate row colors for the CListCtrl.

Sample Image

Introduction

I have seen a lot of requests asking how to implement a list control with different colors in each row. After a long time, taking a lot of useful information from this site, it's time to give back something. So, this MFC wrapper code just replaces the CListCtrl control with one that alternates the row color of the control.

Using the code

This class uses the OnCustomDraw and OnEraseBkgnd to accomplish the alternate color effect. The big job is done in the OnEraseBkgnd function, since this part of the code is responsible to "paint" our object. We have to find how many rows are shown as well as the height of each row. We receive these information from the ::GetCountPerPage and ::GetItemPosition (you can refer to MSDN for details) respectively. From this point and after, things are easy.

BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC) 
{
  // TODO: Add your message handler code here

  //       and/or call default


  CRect rect;
  CColoredListCtrl::GetClientRect(rect);


  POINT mypoint;  
  
  CBrush brush0(m_colRow1);
  CBrush brush1(m_colRow2);


 
  int chunk_height=GetCountPerPage();
  pDC->FillRect(&rect,&brush1);

  for (int i=0;i<=chunk_height;i++)
  {
    GetItemPosition(i,&mypoint);
    rect.top=mypoint.y ;
    GetItemPosition(i+1,&mypoint);
    rect.bottom =mypoint.y;
    pDC->FillRect(&rect,i %2 ? &brush1 : &brush0);

  brush0.DeleteObject();
  brush1.DeleteObject();

  return FALSE;
}

To use this code, add the CColoredListCtrl class to your project and replace any CListCtrl with this one.

If you want to change the default color of the rows, just replace the m_colRow1 and m_colRow2 variables in the CColoredListCtrl constructor with the colors you prefer.

The default text color is black RGB(0,0,0). If you also want to change the item's text color then replace the code lplvcd->clrText = RGB(0,0,0); that you can find in the CColoredListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) function.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here