BS>Привет всем!
BS>Есть стандартный ListView со стилями LVS_EX_GRIDLINES и LVS_REPORT (эмуляция Grid-a). Хочется сделать "зебру" — чередующиеся белые и серые полосы. Или выделять некоторые строки иным цветом (красным, если это что-то критическое), в зависимости от значения строки.
BS>Можно ли это сделать средствами обычного ListView?
#define CDDS_SUBITEMPREPAINT (CDDS_ITEM | CDDS_SUBITEM | CDDS_PREPAINT)
void CXxxxxxx::OnMyListCustomDraw( NMHDR * pNMHDR, LRESULT * pResult )
{
NMLVCUSTOMDRAW * pLVCustomDraw = ( NMLVCUSTOMDRAW* ) pNMHDR;
*pResult = CDRF_DODEFAULT;
switch ( pLVCustomDraw->nmcd.dwDrawStage )
{
case CDDS_PREPAINT:
// при начале прорисовки листа указываем, что нам нужны нотификации на прорисовку каждой строки
*pResult |= CDRF_NOTIFYITEMDRAW ;
break;
case CDDS_ITEMPREPAINT:
// если нужно красить строки целиком, то можно остановиться здесь
// установить цвета текста и фона и выставить *pResult |= CDRF_NEWFONT;, НО, нам
// item-ов маловато, хотим прорисовывать разным цветом subitem-ы, поэтому
*pResult |= CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_SUBITEMPREPAINT:
// а вот и они
switch ( pLVCustomDraw->iSubItem ) // каждую колоночку отдельно
{
case IDENT_COL:
if ( чего-то там )
{
pLVCustomDraw->clrTextBk = GetSysColor( COLOR_WINDOW );
pLVCustomDraw->clrText = GetSysColor( COLOR_WINDOWTEXT );
}
break;
case TIME_COL:
if ( чего-то там )
{
pLVCustomDraw->clrText = m_clrWarning;
pLVCustomDraw->clrTextBk = GetSysColor( COLOR_WINDOW );
}
else
{
pLVCustomDraw->clrText = m_clrNoWarning;
pLVCustomDraw->clrTextBk = GetSysColor( COLOR_WINDOW );
}
break;
default:
pLVCustomDraw->clrTextBk = GetSysColor( COLOR_WINDOW );
pLVCustomDraw->clrText = GetSysColor( COLOR_WINDOWTEXT );
break;
}
*pResult |= CDRF_NEWFONT;
break;
}
}