ListCtr控件背景色默认的白色的,能不能像多财务软件那样 奇偶不同行就是间隔行 背景颜色不同
使操作的人眼睛舒服一点?

解决方案 »

  1.   

    重写CListCtrl类,添加处理虚函数DrawItem
    http://blog.csdn.net/visualeleven/article/details/5948057
      

  2.   

    看你您的博客:
     关键代码是这段吗:   if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&  
      (lpDrawItemStruct->itemState & ODS_SELECTED))  
     {  
      dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));  
      dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));  
      dc.FillSolidRect(&lpDrawItemStruct->rcItem,   
       ::GetSysColor(COLOR_HIGHLIGHT));  
     }  
     else  
     {  
      if(lpDrawItemStruct->itemID%2)  
       dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(128,128,128));  
      else  
       dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,128,255));  
     }  
       
      

  3.   

    如果listCtr上还没有数据,先是空白表,那如何先间隔绘其背景?
      

  4.   

    www.codeproject.com/miscctrl/gridctrl.asp
      

  5.   

    if(lpDrawItemStruct->itemID % 2)  
      pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(128,128,128));  
      else  
      pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,128,255)); 
    可以实现了
      

  6.   

    有点小遗憾是,,没有操作数据的时候,就是空白表,这个操作无效
    void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    TCHAR lpBuffer[256]; LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_PARAM ;
    lvi.iItem = lpDrawItemStruct->itemID ; 
    lvi.iSubItem = 0;
    lvi.pszText = lpBuffer ;
    lvi.cchTextMax = sizeof(lpBuffer);
    VERIFY(GetItem(&lvi)); LV_COLUMN lvc, lvcprev ;
    ::ZeroMemory(&lvc, sizeof(lvc));
    ::ZeroMemory(&lvcprev, sizeof(lvcprev));
    lvc.mask = LVCF_WIDTH | LVCF_FMT;
    lvcprev.mask = LVCF_WIDTH | LVCF_FMT; CDC* pDC;
    pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    CRect rtClient;
    GetClientRect(&rtClient);        if(lpDrawItemStruct->itemID % 2)  
                    pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(128,128,128));  
            else  
                    pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,128,255)); 
    }帮帮看看,哪里还有问题?谢谢了
      

  7.   

     afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);//消息函数声明
    BEGIN_MESSAGE_MAP(CListCtrlCl, CListCtrl)
    ...
            ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) 
    END_MESSAGE_MAP()void CListCtrlCl::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
    {
            // TODO: Add your control notification handler code here
            LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
            // TODO: 在此添加控件通知处理程序代码
            if(CDRF_DODEFAULT == pNMCD->nmcd.dwDrawStage)
            {
                    *pResult = CDRF_NOTIFYITEMDRAW;
            }
            else if(CDDS_ITEMPREPAINT == pNMCD->nmcd.dwDrawStage)
            {
                    *pResult = CDRF_NOTIFYSUBITEMDRAW;
            }
            else if((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pNMCD->nmcd.dwDrawStage)
            {
                    COLORREF clrNewTextColor,clrNewBkColor;
                    int nItem = static_cast<int>(pNMCD->nmcd.dwItemSpec);
                    if((nItem + 1)%2 == 0)
                    {
                            clrNewBkColor = RGB(240,240,240); //偶数数行背景颜色
                            clrNewTextColor = RGB(0,0,0); //偶数行文本颜色
                    }
                    else
                    {
                            clrNewBkColor = RGB(255,255,255); //奇数行背景颜色
                            clrNewTextColor = RGB(0,0,0); //奇数行文本颜色
                    }
                    pNMCD->clrTextBk = clrNewBkColor; //设置背景颜色
                    pNMCD->clrText = clrNewTextColor; //设置文本颜色
            }
     *pResult = CDRF_DODEFAULT | CDRF_NOTIFYPOSTPAINT | CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYSUBITEMDRAW;
    }
    为何不行呢?
      

  8.   

    改变颜色的时候,要用DC绘了,先得到DC,再得到每一行的RECT,定义Brush再FillRect上去
      

  9.   

    问题已经完满解决:1)重写CListCtrl类,添加处理虚函数DrawItem
    2)重载OnEraseBkgnd(CDC* pDC);
    3)OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
    并能够空白的时候能有间隔颜色条,有数据的时候也能有间隔条了,,
      

  10.   

    具体代码:
    void CColoredListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
    {
      *pResult = 0;  LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
      int iRow = lplvcd->nmcd.dwItemSpec;  switch(lplvcd->nmcd.dwDrawStage)
      {
        case CDDS_PREPAINT :
        {
          *pResult = CDRF_NOTIFYITEMDRAW;
          return;
        }    // Modify item text and or background
        case CDDS_ITEMPREPAINT:
        {
          lplvcd->clrText = RGB(0,0,0);
          // If you want the sub items the same as the item,
          // set *pResult to CDRF_NEWFONT
          *pResult = CDRF_NOTIFYSUBITEMDRAW;
          return;
        }    // Modify sub item text and/or background
        case CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM:
        {

            if(iRow %2){
             lplvcd->clrTextBk = m_colRow2;
            }
            else{
              lplvcd->clrTextBk = m_colRow1;
            }
            *pResult = CDRF_DODEFAULT;
            return;
        }
      }
       }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;
    }再加上段
    if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&  
      (lpDrawItemStruct->itemState & ODS_SELECTED))  
     {  
      dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));  
      dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));  
      dc.FillSolidRect(&lpDrawItemStruct->rcItem,  
      ::GetSysColor(COLOR_HIGHLIGHT));  
     }  
     else  
     {  
      if(lpDrawItemStruct->itemID%2)  
      dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(128,128,128));  
      else  
      dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,128,255));  
     }   
      

  11.   

    在www.codeproject.com中有例子Alternate Row Colors for the CListCtrl
    它应该可以满足楼主的要求,可以参考。