具体代码: 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: {
http://blog.csdn.net/visualeleven/article/details/5948057
关键代码是这段吗: 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));
}
pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(128,128,128));
else
pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,128,255));
可以实现了
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));
}帮帮看看,哪里还有问题?谢谢了
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;
}
为何不行呢?
2)重载OnEraseBkgnd(CDC* pDC);
3)OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
并能够空白的时候能有间隔颜色条,有数据的时候也能有间隔条了,,
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));
}
它应该可以满足楼主的要求,可以参考。