Можно ли по-своему отрисовывать строки ListView?
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 16.10.02 09:34
Оценка: 51 (4)
#Имя: FAQ.listview.customdraw
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;
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.